多裝置模組

本文件提供逐步操作說明,說明如何建立多裝置模組,並在已知的情況下提及目前的限制。

範例

提供了 CTS 可偵測 Wi-Fi 的多裝置模組。它會透過 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 或持續執行作業在測試中找到及安裝。

Mobly 已打包的程式碼片段可在 Android 的 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 標記可在每部裝置上包含不同的設定,Mobly 設定會按照 XML 中指定的順序接收這些設定。

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

  • 由於與涵蓋率團隊的對話,我們已更新初始 POC,以便透過 target_preparer 安裝程式碼片段 APK:為了確保涵蓋率評估不會過早刪除,請透過 Harness 解除安裝,而非透過 Python 二進位檔中的測試程式碼,這樣在時間方面可提供更佳的保證。

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

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

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

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

$ atest CtsWifiAwareTestCases

您應該會在 atest 輸出內容的摘要標題中看到使用的裝置數量,例如 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