本文提供逐步操作說明,協助您建立多裝置模組,並指出目前已知的限制。
範例
我們提供 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
新增類似於 packages/modules/Wifi/tests/hostsidetests/multidevices/test/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 或持續執行作業在測試中找到及安裝。
Android 版的 Mobly Bundled Snippets 位於 external/mobly-bundled-snippets/。
選用:建立自訂程式碼片段
部分多裝置模組可能需要自訂 Mobly 片段。範例測試包含 packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java 中的 Wi-Fi 感知程式碼片段,該程式碼片段是使用 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 安裝。 mobly-par-file-name
的MoblyBinaryHostTest
必須與 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
您應該會在測試輸出內容的摘要標題中,看到使用的裝置數量,例如 Test executed with 2 device(s)
。
疑難排解
如果在本機執行測試時,因下列原因而失敗:
Virtualenv 錯誤
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
。