本页面介绍了如何构建使用 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_config
和 test_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"],
}
这样,库模块和测试模块将始终使用相同的依赖项。