測試模組

本頁面提供如何建構使用 Rust 測試套件的 rust_test 模組的基本資訊。

編寫基本的 Rust 測試

如需裝置端和主機端 Rust 測試的實際範例,請查看 keystore2 Android.bp,或在 external/rust/crates 目錄中的眾多 Crate 中找出一個。

rust_test 模組會使用 Rust 的 --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)。

避免 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"],
}

這樣一來,程式庫和測試模組就會一律使用相同的依附元件。