atest でプラットフォーム コードをテストする

Android Studio for Platform(ASfP)は atest および Soong テスト モジュールと統合されているため、IDE から Linux ホストマシン、接続されたデバイス、Cuttlefish 仮想デバイスでプラットフォーム テストを実行してデバッグできます。

前提条件

  • AOSP チェックアウトと lunch ターゲットで構成された ASfP プロジェクトを開きます。
  • デバイステストの場合は、実機を接続するか、一致するビルドを実行している Cuttlefish 仮想デバイスを起動します。

テストの実行とデバッグ

ASfP の複数の場所からプラットフォーム テストとデバッグ セッションを起動できます。

  • Android.bp テスト ターゲット: Android.bp ファイルを開き、テスト モジュール(*_test または *_test_host)の横のガターで [実行] をクリックします。
    • 実行: すべての Soong テスト モジュール タイプ(android_test、java_test_host、cc_test、rust_test、python_test、sh_test、android_robolectric_test)で利用できます。
    • デバッグ: android_test モジュール(atest --wait-for-debugger を使用して Java デバッガに接続)と C++ または Rust テスト モジュール(cc_test、cc_test_host、rust_test、rust_test_host、ASfP の組み込み LLDB デバッガで起動)で使用できます。
  • ソースファイルのガターアイコン: ソースコード内のテストクラスまたは @Test メソッドの横にある [実行] をクリックして、その特定のテストを実行またはデバッグします。
  • 右クリックのコンテキスト メニュー: テストファイル、クラス、メソッド、Android.bp モジュールを右クリックし、[Run] または [Debug] を選択します。
  • 組み込みエージェント(Android Studio の AI): エージェント ツール ウィンドウで、組み込みエージェントは atest ターゲットを実行して、コード編集後の変更を検証できます。
  • 統合ターミナル: [View] > [ツール ウィンドウ] > [Terminal] を開いて、atest コマンドを直接実行します。

スマートテストの構成とデバッグ

ガターまたはコンテキスト メニューからテストを起動すると、ASfP は Android.bp モジュール グラフを使用して Soong Test 実行構成を作成して構成します。

android_test Java と Kotlin のターゲットをデバッグする

Android.bp の android_test モジュールの横、または Java または Kotlin の JUnit クラスまたは @Test メソッドの横にあるガターアイコンをクリックし、[Debug '<TestName>'] を選択します。ソースファイルのガターから、ASfP は、srcs にファイルが含まれ、構成に <module>、<module>:<SimpleClass>、または <module>:<SimpleClass>#<method> という名前が付けられている最も近い囲み android_test モジュールを選択します。

ASfP は --wait-for-debugger で atest を実行し、モジュールの AndroidManifest.xml からターゲットの package 属性を読み取り、接続されたデバイスでそのプロセスを待機して、Java デバッガをアタッチします。

エディタのガターから android_test メソッドをデバッグする

LLDB で cc_test ターゲットと rust_test ターゲットをデバッグする

C++ または Rust のテスト モジュール(cc_test、cc_test_host、rust_test、rust_test_host)をデバッグするには、Android.bp ガターアイコンをクリックして、[Debug '<TestName>'] を選択します。ASfP は、atest を介して実行するのではなく、組み込みの LLDB デバッガでコンパイルされたテスト バイナリを起動します。

Soong テスト実行構成を設定する

[Run] > [Edit Configurations] を開き、Soong Test 構成を選択して、テストのビルド、デプロイ、起動方法をカスタマイズします。

  • モジュールの自動補完と Android.bp ナビゲーション: [Module] フィールドは、プロジェクト内のインデックス登録された Soong テスト モジュールから自動補完されます。フィールドの横にある [Go to Android.bp] をクリックして、Android.bp のモジュールの宣言に移動します。
  • 実行対象: デバイスまたはホスト(host_supported: true を含む): ASfP は、モジュールルールとその推移的な defaults チェーン(host_supported、device_supported、enabled、target.android.enabled、target.host.enabled)を評価します。
    • デュアル ターゲット テスト(cc_test と rust_test、host_supported: true を含む): [デバイス] と [ホスト] の両方のラジオボタンが使用可能です(デフォルトは [デバイス])。デバイスとホストはそれぞれ、独自の独立した LLDB デバッガ テンプレートを保持します。[Run on] を [Device] と [Host] の間で切り替えると、各ターゲットで行われたカスタマイズを保持しながら、リモート デバイスの lldb-server 構成とローカルホストのバイナリ構成が入れ替わります。
    • 単一ターゲット テスト: C++ または Rust のテストが 1 つの環境(デバイスのみの cc_test、ホストのみの cc_test_host または rust_test_host など)でのみビルドされる場合、ASfP はサポートされているターゲットを選択し、サポートされていないラジオボタンを無効にして、説明ツールチップを表示します: 「<module> (<ruleType>) doesn't build for the host or device.」
  • リリース前タスク(ネイティブ テスト モジュールのビルドと atest によるデプロイ): すべての Soong テスト設定には、デフォルトで 2 つのリリース前タスクが含まれています。
    • ネイティブ テスト モジュールをビルド: LLDB を開始する前に、<module>-target(デバイスの場合)または <module>-host(ホストの場合)をビルドします。
    • atest でデプロイ: デバイスでデバッグする場合、atest <module> --collect-tests-only --disable-teardown -it -s <serial> -- --abi <abi> を実行して、LLDB がバイナリを起動する前に Tradefed がテスト依存関係をプッシュし、ターゲット プリペアラを実行します。[Deploy with atest] チップにカーソルを合わせると、正確な atest コマンドをプレビューできます。依存関係がすでにデバイスにある場合のイテレーションを高速化するには、atest でデプロイを削除して、ASfP がテスト バイナリのみを直接プッシュするようにします。[Run on: Host] を選択すると、ASfP は自動的に [Deploy with atest] をスキップします。
  • オプションとデバッガを変更する(LLDB オプション カード): [オプションを変更] を使用して、オプションの構成フィールドを追加します。
    • プログラム引数(オペレーティング システム、C++ と Rust のテストのみ): デバッグ時に --gtest_filter または libtest フィルタの後に cc_test または rust_test バイナリに直接渡される追加の引数。
    • atest 引数(テスト): テストの実行時、または atest でデプロイを使用してデバイスを準備する際に atest に渡される追加のフラグ。
    • デバッガ(C++ と Rust のテストのみ): [モジュール] が cc_test* または rust_test* ターゲットの場合に表示されます。[LLDB options] カード(Stop on entry、Cache symbols across sessions、Load symbols on demand、Rust テスト用の With Rust visualizers など)を切り替え、[Reset to defaults] をクリックしてアクティブな [Device] または [Host] テンプレートをリセットするか、[Modify options > Debugger] から [Symbol directories]、[Init, Pre-run, Post-run, or Exit commands]、[Launch JSON]([DAP Settings])を追加します。

Soong テストの実行構成。起動前タスク、デバイスまたはホストのターゲット、LLDB オプションが表示されている

テスト結果を表示する

テストの実行状況、合格または不合格のステータス、スタック トレース、デバイスログは、ASfP の [実行] または [デバッグ] ツール ウィンドウにリアルタイムで表示されます。

テストのヒント

  • ターゲット テストを実行する: テストスイート全体を実行せずに、エディタのガターから個々のメソッドをテストします。
  • Cuttlefish スナップショットを使用する: Cuttlefish 仮想デバイスでデバイス テストを実行するときに、スナップショットを使用して実行間でクリーンなデバイス状態を復元します。
  • Soong ビルドログを調べる: テストが実行前にコンパイルに失敗した場合は、Soong ツール ウィンドウでコンパイラの診断情報を確認します。