本文檔提供了有關如何建立多設備模組的逐步說明,並指出了已知的當前限制。
例子
提供了 CTS wifi 感知多設備模組。它透過 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 Bundled Snippets 在 Android 中可在external/mobly-bundled-snippets/處找到。
可選:建立自訂片段
某些多設備模組可能需要自訂 Mobly 片段。範例測試包括一個位於packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java的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 文件,例如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 一起安裝。 -
MoblyBinaryHostTest
的mobly-par-file-name
必須與 Android.bp 中的模組名稱相符。 - 請為測試指定
mobly-test-timeout
。它以毫秒為單位,適用於完整的 python 二進位執行(所有測試案例在一起)。這是為了避免測試案例在出現某些問題時永遠掛起。 - 每個
device
標籤可以包含每個設備上的不同設置,Mobly 配置將按照 XML 中指定的相同順序接收它們。
與snippet 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
。