测试模块

本页提供了有关如何构建使用 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"],
}

这样,库和测试模块将始终使用相同的依赖项。