本頁提供了有關如何構建使用 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"],
}
這樣,庫和測試模塊將始終使用相同的依賴項。