このページでは、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_library と rust_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"],
}
これにより、ライブラリとテスト モジュールで常に同じ依存関係が使用されます。