測試模塊

本頁提供了有關如何構建使用 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_configtest_suites屬性如何工作的更多信息,請參閱測試開發工作流程文檔的設置部分。

值得注意的 Rust 測試屬性

rust_test模塊從rust_binary模塊繼承屬性,如二進制模塊頁面所述。

下表中定義的屬性是對適用於所有模塊的重要通用屬性的補充。這些要么對 Rust 測試模塊特別重要,要么表現出特定於rust_test模塊類型的獨特行為。

  • test_harness :高級用法,默認為 true。

如果您的rust_test實現了自己的測試工具並且您不需要使用內置的 Rust 測試工具,則將此設置為 false(換句話說,將其設置為 false不會--test標誌傳遞給 rustc)。

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

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