測試模組

本頁面提供有關如何建立使用 Rust 測試工具的rust_test模組的基本資訊。

編寫基本的 Rust 測試

有關裝置上和主機上 Rust 測試的即時範例,請查看keystore2 Android.bp ,或在external/rust/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範例,請將其新增至預先提交以使測試能夠在 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(換句話說,將其設為 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"],
}

這樣,庫和測試模組將始終使用相同的依賴項。