本文档提供有关如何创建多设备模块的分步说明,并指出了当前已知的限制。
示例
提供了一个 CTS wifi-aware 多设备模块。它通过 wifi 从一个设备发送消息,并验证另一个设备是否收到该消息。
该模块的源代码位于 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",
],
}
使用 data 字段指定测试的代码段,这些代码段将与二进制文件一起打包,并且可以通过 ATest 或在持续执行中定位和安装。
Mobly 捆绑代码段在 Android 中可用,位于 external/mobly-bundled-snippets/。
可选:创建自定义代码段
一些多设备模块可能需要自定义 Mobly 代码段。示例测试包含一个 wifi-aware 代码段,位于 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 规则定义,就像标准 instrumentation 一样
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 中指定的相同顺序接收它们。
与代码段 apk 安装相关
- 由于与 Coverage 团队的对话,初始 POC 已更新为通过 target_preparer 安装代码段 apk:为了确保覆盖率测量不会过早删除,由 Harness 而不是 Python 二进制文件中的测试代码卸载可以更好地保证时间安排。
步骤 5:在本地运行测试:atest
目前,多设备测试仅在物理设备上运行。在运行测试之前,请验证您的测试设备是否处于正确状态。命令 adb devices
应报告您连接的设备列表。如果列表包含非用于测试的设备,请使用 -s 标志指定用于测试的设备。
对于 wifi 测试,请确保为设备启用 wifi(在恢复出厂设置后)。
您可以使用 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
在您的 PATH 中。将“~/.local/bin”添加到 PATH 应该可以解决问题。如果未安装 virtualenv,请按照以下步骤操作:https://virtualenv.pypa.io/en/latest/installation.html
预期至少获得 2 个控制器对象,但只获得 1 个
测试模块要么是多设备模块,要么是单设备模块,没有混合模块。如果您尝试在没有多个设备的情况下运行多设备模块,您将看到此错误
预期至少获得 2 个控制器对象,但只获得 1 个
在多设备模式下执行模块将解决此问题。
对于 CTS:您可以使用分片来触发它(例如:--shard-count 2)或 run cts-multidevces
。