このドキュメントでは、マルチデバイスモジュールを作成する方法を段階的に説明し、既知の場合は現在の制限を呼び出します。
標本、見本
CTSWi-Fi対応マルチデバイスモジュールが提供されています。 Wi-Fi経由で一方のデバイスからメッセージを送信し、もう一方のデバイスがメッセージを受信したことを確認します。
モジュールのソースは、 cts / hostsidetests / multidevices/wifi_awareにあります。
有用だと思う限り多くのコメントで例に注釈を付けました。
ステップ1:モジュールフォルダーを作成する
所属するスイートプロジェクトにマルチデバイスモジュール用のフォルダを作成することをお勧めします。例: cts / hostsidetests /multidevices/ 。これをお勧めします。これにより、すべてのマルチデバイスモジュールが少なくとも最初は併置されたままになり、例を見つけやすくなります。
このモジュールのすべてのファイルは、独自のモジュールフォルダーに配置する必要があります。例: wifi_aware 。
通常、モジュールのOWNERSファイルが必要であり、バグコンポーネントを指定する必要があります。例については、 cts / hostsidetests / multidevices / wifi_aware/OWNERSを参照してください。
ステップ2:テストを作成する
ここで、テストロジックを実装します。それは何がテストされているかに大きく依存します。
次のようなMoblyテストソースを作成します: wifi_aware_test.py 。
ステップ3:ビルドファイルを作成します:Android.bp
cts / hostsidetests / multidevices / wifi_aware/Android.bpのようなAndroid.bpファイルを追加します。次のように、python_test_hostモジュールを定義します。
python_test_host {
    name: "CtsWifiAwareTestCases",
    main: "wifi_aware_test.py",
    srcs: ["wifi_aware_test.py"],
    test_suites: [
        "cts",
        "general-tests",
    ],
    test_options: {
        unit_test: false,
    },
    data: [
          // Package the snippet with the mobly test
        ":wifi_aware_snippet",
    ],
}
データフィールドを使用してテストのスニペットを指定します。このスニペットはバイナリとともにパックされ、ATestによるテストまたは連続実行で検索およびインストールできます。
Mobly Bundled Snippetsは、Androidのexternal /mobly-bundled-snippets/で入手できます。
オプション:カスタムスニペットを作成します
一部のマルチデバイスモジュールでは、カスタムMoblyスニペットが必要になる場合があります。サンプルテストには、 cts / hostsidetests / multidevices / wifi_aware / snippet /にあるwifi対応のスニペットが含まれています。これは、Androidでexternal /mobly-snippet-lib/にあるMoblySnippetLibで構築されています。
スニペットは、標準のインストルメンテーションのように、Android.bpのandroid_testルールで定義する必要があります。
android_test {
    name: "wifi_aware_snippet",
    sdk_version: "current",
    srcs: [
        "CallbackUtils.java",
        "WifiAwareSnippet.java",
    ],
    manifest: "AndroidManifest.xml",
    static_libs: [
        "androidx.test.runner",
        "guava",
        "mobly-snippet-lib",
    ],
}
ステップ4:モジュール構成を作成します:AndroidTest.xml
cts / hostsidetests / multidevices / wifi_aware/AndroidTest.xmlのようなAndroidTest.xmlファイルを追加します。このテスト構成では、次のように、テスト用に2つのデバイスを指定する必要があります。
<configuration description="Config for CTS Wifi Aware test cases">
    <option name="test-suite-tag" value="cts" />
    <option name="config-descriptor:metadata" key="component" value="wifi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
    <device name="device1">
        <!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
             So it's a lot easier to install APKs outside the python code.
        -->
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
          <!-- Any python dependencies can be specified and will be installed with pip -->
          <option name="dep-module" value="mobly" />
        </target_preparer>
    </device>
    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
    </device>
    <test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
      <!-- The mobly-par-file-name should match the module name -->
      <option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
      <!-- Timeout limit in milliseconds for all test cases of the python binary -->
      <option name="mobly-test-timeout" value="60000" />
    </test>
</configuration>
そのことに注意してください:
- このサンプルテストはMoblyに依存しています。 
PythonVirtualenvPreparerには任意の依存関係を指定でき、pipとともにインストールされます。 -  MoblyBinaryHostTestの
mobly-par-file-nameは、MoblyBinaryHostTestのようにモジュール名と一致する必要があります。 -  
mobly-test-timeoutを指定してください。これはミリ秒単位であり、完全なpythonバイナリ実行に適用されます(すべてのテストケースを合わせて)。これは、いくつかの問題が発生した場合にテストケースが永久にハングするのを防ぐために必要です。 - 各
deviceタグには、各デバイスで個別の設定を含めることができます。Mobly構成は、XMLで指定されたのと同じ順序でそれらを受け取ります。 
スニペットapkのインストールに関連:
- 最初のPOCは、カバレッジチームとの会話により、target_preparerを介してスニペットapkをインストールするように更新されました。カバレッジ測定値が早期に削除されないようにするために、Pythonバイナリのテストコードではなくハーネスによるアンインストールにより、タイミングの点でより良い保証が提供されます。
 
ステップ5:ローカルでテストを実行する:atest
現在、マルチデバイステストは物理デバイスでのみ実行されます。テストを実行する前に、テストデバイスが適切な状態にあることを確認してください。コマンドadb devicesは、接続されているデバイスのリストを報告する必要があります。リストにテスト用ではないデバイスが含まれている場合は、-sフラグを使用してテスト用のデバイスを指定します。
Wi-Fiテストの場合は、デバイスでWi-Fiが有効になっていることを確認してください(工場出荷時のリセット後)。
atestを使用してローカルでテストを実行できます。
$ atest CtsWifiAwareTestCases
 Test executed with 2 device(s)ように、テスト出力の要約見出しで使用されているデバイスの数が表示されます。
トラブルシューティング
次の理由でローカルで実行しているときにテストが失敗した場合:
Virtualenvエラー
java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory
 virtualenvがPATHに含まれていることを確認してください。 PATHに「〜/ .local/bin」を追加すると修正されます。 virtualenvがインストールされていない場合は、https://virtualenv.pypa.io/en/latest/installation.htmlに従ってください。
少なくとも2つのコントローラーオブジェクトを取得することが期待され、1つを取得しました
テストモジュールはマルチデバイスまたはシングルデバイスのいずれかであり、混合モジュールはありません。複数のデバイスなしでマルチデバイスモジュールを実行しようとすると、次のエラーが表示されます。
 Expected to get at least 2 controller objects, got 1
モジュールをマルチデバイスモードで実行すると、問題が解決します。
 CTSの場合:シャーディングを使用してトリガーするか(例:-shard-count 2)、 run cts-multidevces 。