测试模块

本页面介绍了如何构建使用 Rust 测试框架的 rust_test 模块的基本信息。

编写基本的 Rust 测试

如需查看设备上和主机上 Rust 测试的实时示例,请查看 keystore2 Android.bp,或在 external/rust/crates 目录中的许多 crate 中找到一个。

rust_test 模块使用 rustc 的 --test 标记进行构建,该标记从使用 #[test] 属性标记的代码创建测试。如需了解详情,请参阅 Rust 参考测试属性文档。

按如下所示定义测试模块

rust_test {
    name: "libfoo_inline_tests",

    // Specify the entry point of your library or binary to run all tests
    // specified in-line with the test attribute.
    srcs: ["src/lib.rs"],

    // Tradefed test suite to include this test in.
    test_suites: ["general-tests"],

    // Autogenerate the test config
    auto_gen_config: true,

    rustlibs: [
        "libfoo",
    ],
}

TEST_MAPPING 文件包含测试列表。虽然这不是必需的,但如果您确实创建了 TEST_MAPPING 文件,则您在其中包含的测试将在预提交测试中运行,并且可以使用 atest 调用。

您可以参考 TEST_MAPPING 文档了解更多信息,但对于 libfoo_inline_tests 示例,请将其添加到预提交中以启用在 TreeHugger 上的测试运行

{
  "presubmit": [
    {
      "name": "libfoo_inline_tests",
    },
  ]
}

请注意,除非 unit_tests: 设置为 false,否则 rust_test_host 模块默认在预提交中运行,因此您无需在 TEST_MAPPING 文件中声明这些模块。

如需详细了解 auto_gen_configtest_suites 属性的工作原理,请参阅 蓝图 文档的设置部分,网址为 测试开发工作流文档。

值得注意的 Rust 测试属性

rust_test 模块从 二进制模块页面所述的 rust_binary 模块继承属性。

下表定义的属性是对适用于所有模块的重要的通用属性的补充。这些属性对于 Rust 测试模块尤为重要,或者表现出 rust_test 模块类型特有的行为。

  • test_harness:高级用法,默认为 true。

如果您的 rust_test 实现了自己的测试框架,并且您不需要使用内置的 Rust 测试框架(换句话说,将此设置为 false 不会--test 标记传递给 rustc),请将其设置为 false。

避免 rust_library 和 rust_test 之间出现重复

当您通过嵌套模块使用内联 Rust 测试时,最终会在 Android.bp 文件中出现重复。问题是您必须列出两次依赖项,一次用于 rust_library,一次用于 rust_test

rust_library {
    name: "libfoo",
    srcs: ["src/lib.rs"],
    rustlibs: [
        "libx",
        "liby",
        "libz",
    ],
}

rust_test {
    name: "libfoo_inline_tests",
    srcs: ["src/lib.rs"],
    test_suites: ["general-tests"],
    rustlibs: [
        "libx",
        "liby",
        "libz",
    ],
}

每个 rust_test 模块最终都会列出与相应的 rust_library 模块相同的依赖项。为了确保模块之间的一致性,您可以在 rust_defaults 模块中仅列出一次依赖项

rust_defaults {
    name: "libfoo_defaults",
    srcs: ["src/lib.rs"],
    rustlibs: [
        "libx",
        "liby",
        "libz",
    ],
}

rust_library {
    name: "libfoo",
    defaults: ["libfoo_defaults"],
}

rust_test {
    name: "libfoo_inline_tests",
    defaults: ["libfoo_defaults"],
    test_suites: ["general-tests"],
}

这样,库模块和测试模块将始终使用相同的依赖项。