SDV テスト フレームワーク ライブラリ

このページでは、SDV テスト フレームワーク ライブラリの概要を説明し、テストの設定、構成、実行について説明します。エンドツーエンドのテストには、SDV テスト フレームワークを使用します。このツールは Mobly をベースにしており、テストは Python で記述します。

テスト方法を選択する

テストを作成する前に、検証スコープに一致するテストランナーを選択します。

テストスコープ Soong モジュール タイプ 実行ツール 使用する場面
サービス バンドルの単体テスト rust_test、rust_test_host、または cc_test atest ホストまたは単一の Cuttlefish 仮想マシン(VM)で、分離された Rust または C++ のビジネス ロジック、データ変換、ヘルパークレートを検証します。
エンドツーエンドおよびマルチ VM システムテスト python_test_host(SDV テスト フレームワーク) atest または CATBox 1 ~ 3 台の VM で、サービス バンドルのライフサイクル オーケストレーション、VM 間通信、SOME/IP ブリッジ、ハードウェア ターゲットを検証します。

環境を設定する

このページでは、SDV 用にワークステーションがすでに設定されていることを前提としています。フレームワーク テストを実行するには、virtualenv をインストールします。

Python 依存関係

Android で依存関係を管理する際のおすすめの方法は、ビルド構成を使用して、テスト、Python、それらの依存関係を実行可能ファイルとしてパッケージ化することです。SDV テスト リポジトリでは、このアプローチに従う必要があります。

SDV テスト フレームワーク ライブラリは、デフォルトで次の依存関係を提供します。

  • mobly
  • absl-py テストでパラメータ化を使用するために必要です。
  • pexpect。インタラクティブ コマンド機能に必要です。
  • ptyprocess。インタラクティブ コマンド機能に必要です。

テスト固有の依存関係が必要な場合は、テストの Android.bp ファイルに含めます。

python_test_host {
    …
    libs: [
        "<DEPENDENCY1>",
        "<DEPENDENCY2>",
        …
    ],
    …
}

システムテストの種類

システムテストは、SDV テスト フレームワークを使用して作成します。フレームワークは、次のタイプを区別します。テストを正しく分類します。

  • サンプルテスト: SDV サンプル サービスを実行し、結果が想定される出力と一致することを確認します。
  • E2E テスト: SDV サンプル サービスを使用しないでください。
  • 長時間実行テスト: 長時間の実行期間を想定して設計されています。
  • パフォーマンス テスト: perfetto ライブラリを使用します。
  • ハードウェア テスト: Cuttlefish(CF)ではなく、実機でのみ実行されるように設計されています。

テストの作成

フレームワークを使用して作成されたテストはすべて、テスト リポジトリに配置する必要があります。テストの正確な場所は、テストの種類によって異なります。ディレクトリ パス、Python テストクラス テンプレート、Android.bp ルール、Mobly コーディング ガイドラインについては、SDV システムテストの作成をご覧ください。

テストを構成する

atest と CATBox の両方を使用して実行するようにすべてのテストを構成します。

atest を構成する

このフレームワークには、1 台、2 台、3 台の VM テスト用のテンプレートが用意されています。次のコードを Android.bp ファイルに追加します。

  • 1 つの VM:

    python_test_host {
      ...
      test_config_template: ":sdv_one_device",
    }
    
  • 2 つの VM:

    python_test_host {
      ...
      test_config_template: ":sdv_two_devices",
    }
    
  • 3 つの VM:

    python_test_host {
      ...
      test_config_template: ":sdv_three_devices",
    }
    

ほとんどのテストでは、デフォルトのテンプレートで十分です。やむを得ない理由がない限り、カスタム構成は作成しないでください。

デフォルトのタイムアウトを更新する

デフォルトのタイムアウトは、テストをローカルで実行するのに十分な長さです。

タイムアウトが原因でローカルでテストが失敗する場合は、テストを分割することを検討してください。テストケースが多数ある非常に長いテストは、実行のボトルネックになる可能性があります。

デフォルトよりも長いタイムアウトを設定する必要がある場合は、続きをご覧ください。

デフォルトのタイムアウトをオーバーライドする

このフレームワークは、atest 実行用のテンプレートの拡張をサポートしていません。そのため、タイムアウトが延長された、提供されているテンプレートを使用してください。

  • 1 つの VM の長時間テスト:

    python_test_host {
      ...
      test_config_template: ":sdv_one_device_long_test",
    }
    
  • 2 つの VM の長時間テスト:

    python_test_host {
      ...
      test_config_template: ":sdv_two_devices_long_test",
    }
    

このテンプレートを使用する目的を明確に示し、延長時間が必要な理由(テストで特定の時間がかかるアーティファクトをダウンロードする必要がある場合など)を説明するコメントを追加します。

デバイスにファイルを push する

次の手順では、atest 構成のファイルをデバイスに push する方法について説明します。

デバイスにファイルを push する

このフレームワークは、atest 実行用のテンプレートの拡張をサポートしていません。したがって、デフォルトのテンプレートを完全に置き換え、デバイスに対応する target_preparer オプションを含む AndroidTest.xml ファイルを作成する必要があります。

  1. テンプレートの内容をコピーします。

    • sdv-one-device.xml
    • sdv-two-devices.xml
    • sdv-three-devices.xml
  2. {MODULE} をテストのモジュール名に更新します。

  3. 各デバイスに com.android.tradefed.targetprep.PushFilePreparer を追加します。

<device name="device1">
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
    <option name="cleanup" value="true" />
    <option name="push-file" key="<FILE_NAME>" value="<REMOTE_FILE_PATH>" />
  </target_preparer>
</device>

CATBox を構成する

テストをスイートとして実行するには、CATBox 構成が必要です。

  1. libraries/sdv/sdv_catbox/res/config/ に新しい構成ファイルを作成し、次の命名規則に従います。

    • サンプルテスト: sdv-sample-<NAME>-test.xml
    • E2E テスト: sdv-e2e-<NAME>-test.xml
    • 長時間実行テスト: sdv-long-running-<NAME>-test.xml
    • パフォーマンス テスト: sdv-performance-<NAME>-test.xml
    • ハードウェア テスト: sdv-hw-<NAME>-test.xml
  2. テストタイプに基づいて、対応する情報を追加します。

  • 1 つの VM テスト構成:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/one-device" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    
  • 2 つの VM のテスト構成:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/two-devices" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    
  • 3 つの VM のテスト構成:

    <configuration description="SDV <NAME> Test">
        <!-- Template for Device Configuration -->
        <template-include name="device-config" default="sdv-device-config/three-devices" />
    
        <!-- Plan. Use the same name as the file name -->
        <option name="plan" value="<CONFIG_FILE_NAME>"/>
    
        <!-- Test: mobly-par-file-name should match the module name -->
        <option name="mobly-host:mobly-par-file-name" value="<ModuleName>" />
    </configuration>
    

ほとんどのテストでは、デフォルトのテンプレートで十分です。やむを得ない理由がない限り、カスタム構成は作成しないでください。

デフォルトのタイムアウトを更新する

デフォルトのタイムアウトがテストに十分でない場合は、オーバーライドできます。

デフォルトのタイムアウトをオーバーライドする

デフォルトのタイムアウトをオーバーライドするには、構成ファイルの末尾に次の行を追加します。長時間テストの最大タイムアウトは 10 分にする必要があります。

  <!-- Long Test - 10 minutes timeout: <REASON> -->
  <option name="mobly-host:mobly-test-timeout" value="600000" />

デバイスにファイルを push する

次のセクションでは、CATBox の構成時にファイルをデバイスに push する方法について説明します。

デバイスにファイルを push する

対応するデバイスにファイルを push するには、plan オプションの後に次の構成を追加します。

<!-- Automatically pushes config file to device-->
<device name="device1">
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
    <option name="cleanup" value="true" />
    <option name="push-file"
      key="<FILE_NAME>"
      value="<REMOTE_FILE_PATH>"
    />
  </target_preparer>
</device>

各デバイスにファイルが必要な場合は、各デバイスの構成(name=device1、name=device2 など)を追加します。

テスト実行

以下の手順は、動作する SDV 環境の設定が完了していることを前提としています。

環境を設定する

フレームワークは Cloud Virtual Device(CVD)仮想デバイス インスタンスを起動しないため、テストを実行する前に起動する必要があります。

  1. 環境をセットアップして SDV ターゲットを起動します。

    . build/envsetup.sh
    lunch <TARGET>
    
  2. 最初の CVD インスタンスを起動します。

    cvd create --config=sdv_core_instance1
    
  3. 2 つ目の CVD インスタンスを起動します(マルチ VM テスト用)。

    cvd create --config=sdv_core_instance2
    
  4. 3 番目の CVD インスタンスを起動します(マルチ VM テスト用)。

    cvd create --config=sdv_core_instance3
    

atest を実行する

atest <TestModuleName>

CATBox を実行する

これらのコマンドは、リポジトリのルート ディレクトリにいることを前提としています。

  1. CATBox をビルドします。m catbox
  2. (省略可)CATBox で利用可能なすべての SDV テストプランを表示します。
out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed l p | grep sdv-

テストを実行します。

  • 1 つの VM テストを実行する:

    NOTIFY_AS_NATIVE=0.0.0.0:6520 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520
    
  • 2 つの VM のテストを実行する:

    NOTIFY_AS_NATIVE=0.0.0.0:6520,0.0.0.0:6521 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520 --{device2}serial 0.0.0.0:6521
    
  • 3 つの VM のテストを実行する:

    NOTIFY_AS_NATIVE=0.0.0.0:6520,0.0.0.0:6521,0.0.0.0:6522 out/host/linux-x86/catbox/android-catbox/tools/catbox-tradefed run commandAndExit TEST_PLAN_NAME --{device1}serial 0.0.0.0:6520 --{device2}serial 0.0.0.0:6521 --{device3}serial 0.0.0.0:6522