View a markdown version of this page

将 Android Instrumentation 与 Device Farm 集成 - AWS Device Farm

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Android Instrumentation 与 Device Farm 集成

注意

按照以下说明将 Android Instrumentation 测试与 AWS Device Farm 集成。有关在 Device Farm 中使用 Instrumentation 测试的更多信息,请参阅适用于 Android 的 Instrumentation 与 AWS Device Farm

运行 Android 仪器测试(控制台)

使用 Device Farm 控制台上传您的测试。

  1. 登录设备农场控制台,网址为https://console.aws.amazon.com/devicefarm

  2. 在导航窗格中,选择移动设备测试,然后选择项目

  3. 在项目列表中,选择要将测试上传到的项目。

    提示

    您可以使用搜索栏按名称筛选项目列表。

    要创建项目,请按照在 AWS Device Farm 中创建项目中的说明操作。

  4. 选择创建规则

  5. “选择应用程序和运行类型” 下的 “运行类型” 部分中,选择 Android 应用程序

  6. 如果您没有应用程序请在 “选择应用程序” 下的 “应用程序选择选项” 部分,选择 Device Farm 提供的示例应用程序。如果您自带应用程序,请选择上传自己的应用程序,然后选择您的 APK(.apk 文件格式)。

  7. 在 “配置测试” 下的 “选择测试框架” 部分中,选择 “仪器”,然后选择 “选择文件” 。浏览并选择包含您的测试的 APK 文件(.apk 文件格式)。

  8. 在 “选择您的执行环境” 下,选择 “在自定义环境中运行测试” 或 “在我们的标准环境中运行测试” 有关更多信息,请参阅 AWS Device Farm 中的测试环境

  9. 如果您选择了自定义环境,则可以使用为插桩测试填充的默认测试规范,也可以选择上传自己的测试规范来提供自己的测试规范。

  10. “选择设备” 下,选择设备选择方法。选择 “使用设备池”,从精选的设备集合或您创建的自定义设备池中进行选择。选择 “手动选择设备” 以选择要运行测试的单个设备。设备兼容性部分显示所选池中有多少设备与您的应用程序兼容。有关更多信息,请参阅 AWS Device Farm 中的设备支持

  11. 要配置运行级别的属性,请更新运行设置部分。您可以在这里执行以下操作:

    1. (可选)要让 Device Farm 在运行完成后生成测试报告,请选择生成测试报告。此选项仅在自定义测试环境中可用。Device Farm 根据测试规范输出中包含的仪器结果生成报告。如果您上传自己的测试规范,请确保它将仪器结果输出到您的测试规范输出中。

  12. 完成剩余步骤,然后开始运行。

查看测试报告(控制台)

  1. 登录设备农场控制台,网址为https://console.aws.amazon.com/devicefarm

  2. 在导航窗格中,选择移动设备测试,然后选择项目

  3. 选择包含要检查的运行的项目。

  4. 选择已完成的运行以打开其详细信息。

  5. 选择一个已完成的任务来打开该设备的结果。

启用测试见解后

作业结果包括 “测试报告” 选项卡。选择它来查看每项测试的明细。以下屏幕截图显示了测试报告选项卡,其中所有列均可见。

已完成的检测任务的 “测试报告” 选项卡上的第一组列。
已完成的仪器作业的 “测试报告” 选项卡上的其余列。

该选项卡显示每个测试的以下字段:

testName

测试方法的名称。

testClass

测试类的名称。

result

测试的设备群结果。

frameworkResult

仪器框架报告的结果。设备群将此值映射到标准化result字段。

durationSeconds

测试的持续时间,以秒为单位。

startTimestamp

测试开始的时间。

endTimestamp

测试结束的时间。

current

测试在运行中的位置。

numTests

运行中的测试总数。

statusCode

测试报告的仪器状态码。

stream

测试仪器输出的人类可读版本。

stackTrace

对于失败的测试,失败的堆栈跟踪。

要将完整测试报告下载为 JSON 文件,请在作业详细信息顶部选择下载完整摘要。

要选择显示哪些列,请选择齿轮图标。在设置中,您可以选择要显示的列并打开或关闭按类别分组。默认情况下,按类别分组处于启用状态,它按测试类别对测试进行分组。将其关闭以查看所有测试的平面列表,如以下屏幕截图所示。

关闭了按类别分组的测试报告选项卡,显示了测试的平面列表。

未启用测试见解

作业结果显示标准测试输出和工件,但不显示测试报告选项卡。要生成测试报告,请在启用测试见解的情况下安排一次新的运行。

未启用测试见解的已完成仪器作业的作业结果。

查看测试报告 (AWS CLI)

运行get-job并指定作业 ARN:

aws devicefarm get-job --arn arn: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