本頁面提供如何建構使用 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。
避免 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"],
}
這樣一來,程式庫和測試模組就會一律使用相同的依附元件。