多設備套件

該文檔提供了有關如何創建多設備模塊的分步說明,並在已知時指出了當前限制。

樣本

提供了一個 CTS wifi 感知多設備模塊。它通過 wifi 從一個設備發送一條消息,並驗證另一台設備接收到它。

該模塊的來源位於cts/hostsidetests/multidevices/wifi_aware

我們已經用我們認為有用的註釋對示例進行了註釋。

第一步:創建模塊文件夾

建議在它所屬的套件項目中為您的多設備模塊創建一個文件夾。例如: cts/hostsidetests/multidevices/ 。我們建議這樣做,以便所有多設備模塊至少在開始時保持並置,這將更容易發現示例。

這個模塊的所有文件都應該放在他們自己的模塊文件夾下。例如: wifi_aware

通常需要模塊的 OWNERS 文件,並且必須在其中指定錯誤組件。有關示例,請參閱cts/hostsidetests/multidevices/wifi_aware/OWNERS

第 2 步:創建測試

這是您實現測試邏輯的地方。它高度依賴於正在測試的內容。

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

第 3 步:創建構建文件:Android.bp

添加一個 Android.bp 文件,例如cts/hostsidetests/multidevices/wifi_aware/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 感知片段,該片段是使用 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 文件,例如cts/hostsidetests/multidevices/wifi_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 安裝。
  • MoblyBinaryHostTest 的MoblyBinaryHostTest mobly-par-file-name必須與 Android.bp 中的模塊名稱匹配。
  • 請為測試指定一個mobly-test-timeout 。它以毫秒為單位,適用於完整的 python 二進制執行(所有測試用例一起)。這是為了避免測試用例在某些問題的情況下永遠掛起。
  • 每個device標籤可以在每個設備上包含不同的設置,Mobly 配置將按照 XML 中指定的順序接收它們。

與片段 apk 安裝相關:

  • 由於與 Coverage 團隊的對話,初始 POC 已更新為通過 target_preparer 安裝片段 apk:為了確保不會過早刪除覆蓋率測量,通過 Harness 而不是 Python 二進製文件中的測試代碼卸載在時間方面提供了更好的保證。

第 5 步:在本地運行測試:atest

目前,多設備測試僅在物理設備上運行。在運行測試之前,請驗證您的測試設備是否處於正確狀態。命令adb devices應該報告您連接的設備列表。如果列表包含不用於測試的設備,請使用 -s 標誌指定用於測試的設備。

對於 wifi 測試,請確保為設備啟用了 wifi(恢復出廠設置後)。

您可以使用 atest 在本地運行測試:

$ atest CtsWifiAwareTestCases

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

故障排除

如果由於以下原因在本地運行時測試失敗:

虛擬環境錯誤

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

請確保virtualenv在您的 PATH 中。將“~/.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