View a markdown version of this page

将适用于 iOS 的 XCTest UI 与 Device Farm 集成 - AWS Device Farm

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

将适用于 iOS 的 XCTest UI 与 Device Farm 集成

Device Farm 为 XCTest UI 测试框架提供支持。具体而言,设备农场支持用 Swift Objective-C 和 Swift 编写的 XCTest 用户界面测试。

XCTest UI 框架支持在 iOS 开发环境中进行 UI 测试,该测试建立在 XCTest 之上。有关更多信息,请参阅 iOS Developer Library 中的 User Interface Testing

有关 Device Farm 中测试的一般信息,请参阅 AWS Device Farm 中的测试框架和内置测试

按照以下说明将 Device Farm 与适用于 iOS 的 XCTest UI 测试框架集成。

准备 iOS XCTest UI 测试

您可以为 XCTEST_UI 测试程序包上传 .ipa 文件或 .zip 文件。

.ipa 文件是包含捆绑包格式的 iOS Runner 应用程序的应用程序存档。.ipa 文件中不能包含其他文件。

如果您上传一个 .zip 文件,它可以直接包含 iOS Runner 应用程序,也可以包含一个 .ipa 文件。如果您想在测试期间使用其他文件,您也可以在 .zip 文件中包含它们。例如,您可以在 .zip 文件中包含诸如 .xctestrun.xcworkspace.xcodeproj 之类的文件,以便在 Device Farm 上运行 XCUI 测试计划。XCUI 测试类型的默认测试规范文件中提供了关于如何运行测试计划的详细说明。

选项 1:创建 XCTest UI .ipa 程序包

你的AppNameUITest-Runner.app 包是在你构建项目进行测试时由 Xcode 生成的。您可在项目的 Products 目录中找到该捆绑包。

创建 .ipa 文件:

  1. 创建名为 Payload 的目录。

  2. 将您的应用程序目录添加到 Payload 目录。

  3. 将 Payload 目录存档成一个 .zip 文件,然后将文件扩展名更改为 .ipa

以下文件夹结构显示了如何my-project-nameUITest-Runner.app将名为的示例应用程序打包为.ipa文件:

. └── my-project-nameUITest.ipa └── Payload (directory) └── my-project-nameUITest-Runner.app

选项 2:创建 XCTest UI .zip 程序包

Device Farm 会自动为您生成一个 .xctestrun 文件,用于运行完整的 XCTest UI 测试套件。如果您想在 Device Farm 上使用自己的 .xctestrun 文件,您可以将 .xctestrun 文件和应用程序目录压缩成一个 .zip 文件。如果您已经有测试包的.ipa文件,则可以将其包含在此处,而不是*-Runner.app

. └── swift-sample-UI.zip (directory) ├── my-project-nameUITest-Runner.app [OR] my-project-nameUITest.ipa ├── SampleTestPlan_2.xctestrun ├── SampleTestPlan_1.xctestrun └── (any other files)

如果您想为设备农场上的 XCUI 测试运行 Xcode 测试计划,则可以创建一个 zip 文件,其中包含我的项目名称UITest-Runner.app或我的项目名称UITest.ipa文件以及使用测试计划运行 XCTEST_UI 所需的 xcode 源代码文件,包括或文件。.xcworkspace .xcodeproj

以下是使用 .xcodeproj 文件的 zip 示例:

. └── swift-sample-UI.zip (directory) ├── my-project-nameUITest-Runner.app [OR] my-project-nameUITest.ipa ├── (any directory) └── SampleXcodeProject.xcodeproj ├── Testplan_1.xctestplan ├── Testplan_2.xctestplan └── (any other source code files created by xcode with .xcodeproj)

以下是使用 .xcworkspace 文件的 zip 示例:

. └──swift-sample-UI.zip (directory) ├── my-project-nameUITest-Runner.app [OR] my-project-nameUITest.ipa └── (any directory) │ ├── SampleXcodeProject.xcodeproj │ ├── Testplan_1.xctestplan │ ├── Testplan_2.xctestplan | └── (any other source code files created by xcode with .xcodeproj) └── SampleWorkspace.xcworkspace └── contents.xcworkspacedata
注意

请确保您的 XCTest UI .zip 程序包中没有名为“Payload”的目录。

运行 iOS XCTest 用户界面测试(控制台)

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

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

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

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

    提示

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

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

  4. 选择创建运行

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

  6. 选择应用程序部分的应用程序选择选项中,选择上传自己的应用程序。然后,在上传应用程序下,选择选择文件

  7. 浏览到并选择您的 iOS 应用程序文件。该文件必须是 .ipa 文件。

    注意

    确保为 iOS 设备 (而不是模拟器) 构建您的 .ipa 文件。

  8. 配置测试下的设置测试框架部分中,选择 XCTest UI。然后,在上传应用程序下,选择选择文件

  9. 浏览到并选择包含您的 iOS XCTest UI 测试运行器的 .ipa 或 .zip 文件。

  10. (可选)要配置运行级别的属性,请更新运行设置部分:

    1. 要让 Device Farm 在运行完成后生成测试见解报告,请启用 “生成测试报告” 。此选项仅在自定义测试环境中可用。

      以下先决条件适用:

      1. 您的测试必须生成一个 Xco .xcresult de 包并将其写入。$DEVICEFARM_DERIVED_DATA_PATH例如,传递-derivedDataPath $DEVICEFARM_DERIVED_DATA_PATHxcodebuild。如果您保留默认配置,默认 XCTest UI 测试规范会自动生成和存储此包。

      有关查看报告的更多信息,请参阅查看测试报告(控制台)

  11. 完成运行创建过程中的其余步骤。选择要测试的设备,并有选择地指定其他配置。

  12. 选择创建运行。Device Farm 运行测试并在控制台中显示结果。

查看测试报告(控制台)

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

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

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

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

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

启用测试见解后

作业结果包括 “测试报告” 选项卡。选择它可查看测试结果摘要,包括测试总数、通过和失败的测试数量、总测试执行时间以及测试执行时间的中位数。在摘要下方,测试表显示了每项测试的细分。

已完成的 XCTest UI 作业的 “测试报告” 选项卡上的第一组列。
已完成的 XCTest 用户界面作业的 “测试报告” 选项卡上的其余列。

测试表中的每行都包含以下各列:

  • 结果 — 测试是通过、失败还是被跳过。

  • 测试类别 ― 测试所属的类别。

  • 测试名称 ― 测试方法的名称。

  • 堆栈跟踪 — 对于失败的测试,指向失败堆栈跟踪的链接。

  • 持续时间 — 测试运行所花费的时间。

  • 开始时间结束时间 — 测试开始和结束的时间。

  • 框架结果 — XCTest 框架报告的测试结果字符串。

  • 测试包 — 测试所属的测试包。

  • 节点标识符 — 测试用例的 xcresult 节点标识符。

您可以按名称、类别或状态搜索测试。要选择显示哪些列,请选择 “设置” 图标。在设置中,您可以选择要显示的列并打开或关闭按类别分组。默认情况下,按类别分组处于启用状态,它按测试类别对测试进行分组。扩展一个类以查看其各个测试,如以下屏幕截图所示。

“测试报告” 选项卡包含按类别分组的测试,显示每个类别扩展到各自的测试。

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

未启用测试见解

作业结果显示标准测试输出和工件,例如套件日志和屏幕截图选项卡,但没有显示测试报告选项卡。要生成测试报告,请在启用测试见解的情况下安排一次新的运行。

在未启用测试见解的情况下完成的 XCTest UI 作业的作业结果,显示标准选项卡和没有测试报告选项卡。

查看测试报告 (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 Apple iPhone", "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 Apple iPhone", "platform": "IOS", "os": "18", "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: 3.214 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"

以下是 XCTest 界面作业的示例测试报告:

{ "version": "1.0", "jobArn": "arn:aws:devicefarm:us-west-2:123456789012:job:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE/a1b2c3d4-e5f6-4a7b-8c9d-67890EXAMPLE/00000", "deviceName": "Apple iPhone 15", "deviceArn": "arn:aws:devicefarm:us-west-2::device:A1B2C3D4E5F60718293A4B5C6D7E8F90", "deviceOsVersion": "17.5", "metrics": { "testsTotal": 3, "testsPassed": 2, "testsFailed": 1, "testsSkipped": 0, "testsErrored": 0, "testsOther": 0, "testsPassedPercentage": 66.67, "totalTestExecutionDurationSeconds": 6.914, "medianTestExecutionDurationSeconds": 2.062 }, "testDetails": [ { "testName": "test_execute()", "testClass": "AlertsTest", "frameworkResult": "Passed", "result": "PASSED", "durationSeconds": 2.062, "startTimestamp": "2026-07-31T16:58:26.646000Z", "endTimestamp": "2026-07-31T16:58:28.708000Z", "testBundle": "AWSDeviceFarmiOSReferenceAppSwiftUITests", "nodeIdentifier": "AlertsTest/test_execute()" }, { "testName": "test_login()", "testClass": "LoginTest", "frameworkResult": "Failed", "result": "FAILED", "durationSeconds": 3.541, "startTimestamp": "2026-07-31T16:58:29.000000Z", "endTimestamp": "2026-07-31T16:58:32.541000Z", "stackTrace": "LoginTest.swift:88: XCTAssertEqual failed: (\"Welcome\") is not equal to (\"Error\")\nLoginTest.swift:91: XCTAssertTrue failed", "testBundle": "AWSDeviceFarmiOSReferenceAppSwiftUITests", "nodeIdentifier": "LoginTest/test_login()" }, { "testName": "test_themeRendering()", "testClass": "ThemeTest", "frameworkResult": "Passed", "result": "PASSED", "durationSeconds": 1.311, "testBundle": "AWSDeviceFarmiOSReferenceAppSwiftUITests", "nodeIdentifier": "ThemeTest/test_themeRendering()", "testArguments": "Dark Appearance, Portrait" } ] }

该报告包含以下顶级字段:

version, jobArn

报告架构版本和任务的 ARN。

deviceName, deviceArn, deviceOsVersion

运行任务的设备的名称和 ARN 及其操作系统版本。

metrics

作业的汇总结果:测试总数(testsTotal)、测试通过()、失败(testsPassed)、跳过(testsFailed)、错误(testsSkipped)或有其他结果(testsErrored)的测试总数(testsOther),以及通过率(testsPassedPercentage)、总测试持续时间(totalTestExecutionDurationSeconds)和测试持续时间中位数()。medianTestExecutionDurationSeconds

中的每个条目都testDetails包含以下字段:

testName, testClass

测试方法及其测试类的名称。

result, frameworkResult

测试的设备群结果以及 XCTest 框架报告的结果字符串。设备群映射frameworkResult到标准化result字段。

durationSeconds, startTimestamp, endTimestamp

测试的持续时间(以秒为单位),以及开始和结束的时间。

testBundle, nodeIdentifier

测试所属的测试包和测试用例的 xcresult 节点标识符。

testArguments

对于参数化测试调用,为调用的参数标签。

stackTrace

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