多裝置模組

這份文件會逐步說明如何建立多部裝置 並指出目前的限制 (如果已知)。

範例

提供了 CTS 可偵測 Wi-Fi 的多裝置模組。應用程式會從 ,驗證其他裝置收到的裝置。

模組來源位於 packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/

我們在範例中加註了所有覺得實用的註解,

步驟 1:建立模組資料夾

建議你在套件中為多裝置模組建立資料夾 所屬的專案例如:cts/hostsidetests/multidevices/。 建議您採取這項做法,確保所有多裝置模組共用至少 以便更輕鬆地發掘範例

此模組的所有檔案應存放在各自的模組資料夾中。適用對象 範例:wifi_aware

步驟 2:建立測試

您可以在這裡實作測試邏輯。這很取決於 以及要如何接受測試

建立 Mobly 測試來源,例如: wifi_aware_test.py

步驟 3:建立建構檔案:Android.bp

新增類似下方的 Android.bp 檔案 packages/modules/Wifi/tests/hostsidetests/multidevices/test/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 或 持續執行。

您可以在 Android 中取得 Mobly 套裝組合程式碼片段: external/mobly-bundled-snippets/

選用:建立自訂程式碼片段

部分多裝置模組可能需要自訂 Mobly 程式碼片段。範例測試 這個位置是在以下位置加入 Wi-Fi 感知程式碼片段 packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java, 這款產品採用 Mobly Snippet Lib 打造而成,可在 Android 裝置上使用: external/mobly-snippet-lib/

程式碼片段應使用 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

新增 AndroidTest.xml 檔案,例如 packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml。 在此測試設定中,需要指定兩部裝置進行測試, 類似:

<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 安裝。
  • MoblyBinaryHostTestmobly-par-file-name 必須與模組相符 例如 Android.bp
  • 為測試指定 mobly-test-timeout。在幾毫秒內完成 適用於完整的 Python 二進位檔執行作業 (所有測試案例合併)。 請務必這麼做,以免測試案例在發生問題時永久停止運作。
  • 每個 device 標記在每部裝置上都可以有不同的設定:The Mobly config 將按照 XML 中的指定順序接收這些資料。

與程式碼片段 APK 相關 安裝:

  • 初始聯絡窗口已更新為透過以下方式安裝程式碼片段 APK: target_preparer 考量到與涵蓋率團隊的對話內容:為了確保 涵蓋率測量結果不會太早刪除,因此由 Harness 解除安裝 而不是 Python 二進位檔中的測試程式碼 時間。

步驟 5:在本機執行測試:測試

目前,多裝置測試只能在實體裝置上執行。執行 測試,確認測試裝置處於正確狀態。adb devices 指令應會回報已連結的裝置清單。如果清單包含 用於測試用途的裝置,請使用 -s 指定測試裝置 旗標。

若是 Wi-Fi 測試,請確認裝置已啟用 Wi-Fi (恢復原廠設定後)。

您可以使用測試在本機執行測試:

$ atest CtsWifiAwareTestCases

您應該會在測試的摘要標題中看到使用的裝置數量 輸出,例如 Test executed with 2 device(s)

疑難排解

如果在本機執行測試失敗的可能原因如下:

Virtualenv 錯誤

java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory

請確保 virtualenv 位於路徑中。新增「~/.local/bin」遷移至 PATH 後 修復問題。 如果未安裝 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