テスト モジュール

このページでは、Rust テストハーネスを使用する rust_test モジュールのビルド方法に関する基本情報を提供します。

基本的な Rust テストの作成

オンデバイスおよびオンホストの Rust テストの実例については、keystore2 Android.bp を参照するか、external/rust/crates ディレクトリにある多数のクレートの中から見つけることができます。

rust_test モジュールは、rustc の --test フラグを使用してビルドします。これにより、#[test] 属性が付いたコードからテストが作成されます。詳細については、The Rust Reference の Testing Attributes(ドキュメント)をご覧ください。

テスト モジュールを次のように定義します。

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 ファイルを作成すると、このファイル内のテストは presubmit テストで実行され、atest を使用して呼び出すことができます。

詳細については、TEST_MAPPING のドキュメントをご覧ください。ただし、libfoo_inline_tests の例では、以下の行を presubmit に追加して、TreeHugger でテストを実行できるようにします。

{
  "presubmit": [
    {
      "name": "libfoo_inline_tests",
    },
  ]
}

rust_test_host モジュールは、unit_tests:false に設定されている場合を除き、presubmit においてデフォルトで実行されるため、TEST_MAPPING ファイルで宣言する必要はありません。

auto_gen_config プロパティと test_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 ファイル内で重複が生じます。問題は、依存関係を 2 回リストする必要があることです(rust_library で 1 回、rust_test で 1 回)。

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 モジュール内に依存関係を 1 回だけリストしてください。

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

これにより、ライブラリとテスト モジュールで常に同じ依存関係が使用されます。