本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Android Instrumentation 与 Device Farm 集成
注意
按照以下说明将 Android Instrumentation 测试与 AWS Device Farm 集成。有关在 Device Farm 中使用 Instrumentation 测试的更多信息,请参阅适用于 Android 的 Instrumentation 与 AWS Device Farm。
运行 Android 仪器测试(控制台)
使用 Device Farm 控制台上传您的测试。
-
登录设备农场控制台,网址为https://console.aws.amazon.com/devicefarm
。 -
在导航窗格中,选择移动设备测试,然后选择项目。
-
在项目列表中,选择要将测试上传到的项目。
提示
您可以使用搜索栏按名称筛选项目列表。
要创建项目,请按照在 AWS Device Farm 中创建项目中的说明操作。
-
选择创建规则。
-
在 “选择应用程序和运行类型” 下的 “运行类型” 部分中,选择 Android 应用程序。
-
如果您没有应用程序,请在 “选择应用程序” 下的 “应用程序选择选项” 部分,选择 Device Farm 提供的示例应用程序。如果您自带应用程序,请选择上传自己的应用程序,然后选择您的 APK(.apk 文件格式)。
-
在 “配置测试” 下的 “选择测试框架” 部分中,选择 “仪器”,然后选择 “选择文件” 。浏览并选择包含您的测试的 APK 文件(.apk 文件格式)。
-
在 “选择您的执行环境” 下,选择 “在自定义环境中运行测试” 或 “在我们的标准环境中运行测试” 。有关更多信息,请参阅 AWS Device Farm 中的测试环境。
-
如果您选择了自定义环境,则可以使用为插桩测试填充的默认测试规范,也可以选择上传自己的测试规范来提供自己的测试规范。
-
在 “选择设备” 下,选择设备选择方法。选择 “使用设备池”,从精选的设备集合或您创建的自定义设备池中进行选择。选择 “手动选择设备” 以选择要运行测试的单个设备。设备兼容性部分显示所选池中有多少设备与您的应用程序兼容。有关更多信息,请参阅 AWS Device Farm 中的设备支持。
-
要配置运行级别的属性,请更新运行设置部分。您可以在这里执行以下操作:
-
(可选)要让 Device Farm 在运行完成后生成测试报告,请选择生成测试报告。此选项仅在自定义测试环境中可用。Device Farm 根据测试规范输出中包含的仪器结果生成报告。如果您上传自己的测试规范,请确保它将仪器结果输出到您的测试规范输出中。
-
-
完成剩余步骤,然后开始运行。
查看测试报告(控制台)
登录设备农场控制台,网址为https://console.aws.amazon.com/devicefarm
。 -
在导航窗格中,选择移动设备测试,然后选择项目。
-
选择包含要检查的运行的项目。
-
选择已完成的运行以打开其详细信息。
-
选择一个已完成的任务来打开该设备的结果。
启用测试见解后
作业结果包括 “测试报告” 选项卡。选择它来查看每项测试的明细。以下屏幕截图显示了测试报告选项卡,其中所有列均可见。
该选项卡显示每个测试的以下字段:
testName测试方法的名称。
testClass测试类的名称。
result测试的设备群结果。
frameworkResult仪器框架报告的结果。设备群将此值映射到标准化
result字段。durationSeconds测试的持续时间,以秒为单位。
startTimestamp测试开始的时间。
endTimestamp测试结束的时间。
current测试在运行中的位置。
numTests运行中的测试总数。
statusCode测试报告的仪器状态码。
stream测试仪器输出的人类可读版本。
stackTrace对于失败的测试,失败的堆栈跟踪。
要将完整测试报告下载为 JSON 文件,请在作业详细信息顶部选择下载完整摘要。
要选择显示哪些列,请选择齿轮图标。在设置中,您可以选择要显示的列并打开或关闭按类别分组。默认情况下,按类别分组处于启用状态,它按测试类别对测试进行分组。将其关闭以查看所有测试的平面列表,如以下屏幕截图所示。
未启用测试见解
作业结果显示标准测试输出和工件,但不显示测试报告选项卡。要生成测试报告,请在启用测试见解的情况下安排一次新的运行。
查看测试报告 (AWS CLI)
运行get-job并指定作业 ARN:
aws devicefarm get-job --arnarn:aws:devicefarm:us-west-2:123456789012:job:PROJECT_ID/RUN_ID/00000
未启用测试见解
如果您未启用测试洞察,则响应包含标准作业字段,例如任务状态、结果、计数器和设备:
{ "job": { "arn": "arn:aws:devicefarm:us-west-2:123456789012:job:EXAMPLE-PROJECT/EXAMPLE-RUN/00000", "name": "Example Android Phone", "created": "2026-08-05T14:26:56.959000-07:00", "status": "COMPLETED", "result": "PASSED", "counters": { "total": 3, "passed": 3, "failed": 0, "warned": 0, "errored": 0, "stopped": 0, "skipped": 0 }, "message": "Successful test lifecycle of Setup Test", "device": { "arn": "arn:aws:devicefarm:us-west-2::device:EXAMPLEDEVICEID", "name": "Example Android Phone", "platform": "ANDROID", "os": "16", "formFactor": "PHONE", "fleetType": "PUBLIC" }, "deviceMinutes": { "total": 1.38, "metered": 0.0, "unmetered": 1.13 }, "videoCapture": true } }
启用测试见解后
如果您启用了测试见解,则响应中还包含一个insights对象。此对象包含测试报告状态、高级指标和详细报告的预签名 URL:
{ "job": { "arn": "arn:aws:devicefarm:us-west-2:123456789012:job:EXAMPLE-PROJECT/EXAMPLE-RUN/00000", "status": "COMPLETED", "result": "PASSED", "counters": { ... }, "device": { ... }, "deviceMinutes": { ... }, "videoCapture": true, "insights": { "status": "COMPLETED", "testReport": { "message": "Results: 2 Executed | 2 passed, Median test duration: 28.926 seconds.", "metrics": { "testsTotal": 2, "testsPassed": 2, "testsFailed": 0, "testsSkipped": 0, "testsErrored": 0, "testsOther": 0, "testsPassedPercentage": 100.0 }, "testDetailsUrl": "https://EXAMPLE-PRESIGNED-URL" } } } }
该testDetailsUrl字段是完整测试报告 JSON 的预签名 URL。下载以获取每项测试的明细:
curl -o test-report.json "PRESIGNED_URL"
以下是仪器作业的示例测试报告:
{ "version": "1.0", "jobArn": "arn:aws:devicefarm:us-west-2:123456789012:job:EXAMPLE-PROJECT/EXAMPLE-RUN/00000", "metrics": { "testsTotal": 3, "testsPassed": 2, "testsFailed": 1, "testsSkipped": 0, "testsErrored": 0, "testsOther": 0, "testsPassedPercentage": 66.67, "totalTestExecutionDurationSeconds": 26.004, "medianTestExecutionDurationSeconds": 1.598 }, "testDetails": [ { "testName": "testConnect", "testClass": "com.example.myapp.GpsConnectInstrumentedTest", "frameworkResult": "PASSED", "result": "PASSED", "durationSeconds": 24.399, "startTimestamp": "2026-08-05T20:38:30.131514Z", "endTimestamp": "2026-08-05T20:38:54.530369Z", "statusCode": 0, "current": 1, "numTests": 3 }, { "testName": "testHistoryOff", "testClass": "com.example.myapp.NotificationHistoryInstrumentedTest", "frameworkResult": "PASSED", "result": "PASSED", "durationSeconds": 1.598, "startTimestamp": "2026-08-05T20:38:54.531765Z", "endTimestamp": "2026-08-05T20:38:56.130032Z", "statusCode": 0, "current": 2, "numTests": 3 }, { "testName": "testConnect", "testClass": "com.example.myapp.WifiConnectInstrumentedTest", "frameworkResult": "FAILED", "result": "FAILED", "durationSeconds": 0.002, "startTimestamp": "2026-08-05T20:38:56.131857Z", "endTimestamp": "2026-08-05T20:38:56.133770Z", "stackTrace": "java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.test.uiautomator.UiDevice.pressHome()' on a null object reference\n\tat com.example.myapp.WifiConnectInstrumentedTest.testConnect(WifiConnectInstrumentedTest.java:93)\n\t...", "stream": "\nError in testConnect(com.example.myapp.WifiConnectInstrumentedTest):\njava.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.test.uiautomator.UiDevice.pressHome()' on a null object reference\n\t...", "statusCode": -2, "current": 3, "numTests": 3 } ], "errorMessage": "There was 1 failure:\n1) testConnect(com.example.myapp.WifiConnectInstrumentedTest)\njava.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.test.uiautomator.UiDevice.pressHome()' on a null object reference\n\t...\nFAILURES!!!\nTests run: 3, Failures: 1", "instrumentationCode": -1 }
该报告包含以下顶级字段:
version报告架构版本。
jobArn作业的 ARN。
metrics-
汇总作业结果。
metrics对象包含以下字段:testsTotal作业中的测试总数。
testsPassed通过的测试数量。
testsFailed失败的测试数量。
testsSkipped跳过的测试数量。
testsErrored出错的测试次数。
testsOther带有其他结果的测试次数。
testsPassedPercentage通过测试的百分比。
totalTestExecutionDurationSeconds所有测试的总持续时间,以秒为单位。
medianTestExecutionDurationSeconds测试的平均持续时间,以秒为单位。
errorMessage如果运行失败,则会显示一条概述失败情况的错误消息。
instrumentationCode任务的整体仪器退出代码。
testDetails-
每次测试的结果列表。中的每个条目都
testDetails包含以下字段:testName测试方法的名称。
testClass测试类的名称。
result测试的设备群结果。
frameworkResult仪器框架报告的结果。设备群将此值映射到标准化
result字段。durationSeconds测试的持续时间,以秒为单位。
startTimestamp测试开始的时间。
endTimestamp测试结束的时间。
current测试在运行中的位置。
numTests运行中的测试总数。
statusCode测试报告的仪器状态码。
stream测试仪器输出的人类可读版本。
stackTrace对于失败的测试,失败的堆栈跟踪。
(可选)在 Android Instrumentation 测试中截图
您可以拍摄屏幕截图作为您的 Android Instrumentation 测试的一部分。
要拍摄屏幕截图,请调用以下方法之一:
-
对于 Robotium,调用
takeScreenShot方法 (例如,solo.takeScreenShot();)。 -
对于 Spoon,调用
screenshot方法,例如:Spoon.screenshot(activity, "initial_state"); /* Normal test code... */ Spoon.screenshot(activity, "after_login");
在测试运行期间,Device Farm 会从设备上的以下位置获得屏幕截图(如果存在),然后将它们添加到测试报告中:
-
/sdcard/robotium-screenshots -
/sdcard/test-screenshots -
/sdcard/Download/spoon-screenshots/test-class-name/test-method-name -
/data/data/application-package-name/app_spoon-screenshots/test-class-name/test-method-name