本页提供了有关如何构建使用 Rust 测试工具的rust_test
模块的基本信息。
编写一个基本的 Rust 测试
有关设备上和主机上 Rust 测试的实时示例,请查看keystore2 Android.bp ,或在external/rust/crates
目录中的许多 crates 中找到一个。
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
示例,将其添加到 presubmit 以启用您在 TreeHugger 上运行的测试:
{
"presubmit": [
{
"name": "libfoo_inline_tests",
},
]
}
请注意,除非unit_tests:
设置为false
,否则rust_test_host
模块在 presubmit 中默认运行,因此您无需在TEST_MAPPING
文件中声明这些模块。
有关auto_gen_config
和test_suites
属性如何工作的更多信息,请参阅测试开发工作流程文档的设置部分。
值得注意的 Rust 测试属性
rust_test
模块从rust_binary
模块继承属性,如二进制模块页面所述。
下表中定义的属性是对适用于所有模块的重要通用属性的补充。这些要么对 Rust 测试模块特别重要,要么表现出特定于rust_test
模块类型的独特行为。
- test_harness :高级用法,默认为 true。
如果您的rust_test
实现了自己的测试工具并且您不需要使用内置的 Rust 测试工具,则将此设置为 false(换句话说,将其设置为 false不会将--test
标志传递给 rustc)。
避免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"],
}
这样,库和测试模块将始终使用相同的依赖项。