View a markdown version of this page

將適用於 iOS 的 XCTest UI 與 Device Farm 整合 - AWS Device Farm

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將適用於 iOS 的 XCTest UI 與 Device Farm 整合

Device Farm 支援 XCTest UI 測試架構。具體而言,Device Farm 支援以 Objective-C 和 Swift 編寫的 XCTest UI 測試。

XCTest UI 架構可在 iOS 開發中啟用 UI 測試,建置於 XCTest 之上。如需詳細資訊,請參閱 iOS Developer Library 中的 使用者界面測試

如需在 Device Farm 中測試的一般資訊,請參閱 AWS Device Farm 中的測試架構和內建測試

使用以下指示,將 Device Farm 與適用於 iOS 的 XCTest UI 測試架構整合。

準備您的 iOS XCTest UI 測試

您可以上傳.ipa檔案或 XCTEST_UI 測試套件.zip的檔案。

.ipa 檔案是包含套件格式 iOS Runner 應用程式的應用程式封存檔。檔案內不可包含其他.ipa檔案。

如果您上傳.zip檔案,它可以直接包含 iOS Runner 應用程式或 .ipa 檔案。如果您想要在測試期間使用檔案,也可以在.zip檔案中包含其他檔案。例如,您可以包含 或 檔案.xcworkspace.xcodeproj內的.zip檔案.xctestrun,以在裝置陣列上執行 XCUI Test Plans。有關如何執行 Test Plans 的詳細指示可在 XCUI 測試類型的預設測試規格檔案中取得。

選項 1:建立 XCTest UI .ipa 套件

當您建置專案進行測試時,Xcode 會產生 yourAppNameUITest-Runner.app 套件。您可以在專案的「產品」目錄中找到該 bundle。

若要建立 .ipa 檔案:

  1. 建立名為承載的目錄。

  2. 將您的應用程式目錄新增至承載目錄。

  3. 將承載目錄封存至.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 會自動為您產生執行完整 XCTest UI 測試套件.xctestrun的檔案。如果您想要在 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)

如果您想要在 Device Farm 上執行 XCUI 測試的 Xcode 測試計畫,您可以建立包含 my-project-nameUITest-Runner.app my-project-nameUITest.ipa 檔案的 zip,以及使用測試計畫執行 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 UI 測試 (主控台)

使用 Device Farm 主控台上傳您的測試。

  1. 登入 Device Farm 主控台,網址為 https://https://console.aws.amazon.com/devicefarm

  2. 在導覽窗格中,選擇行動裝置測試,然後選擇專案

  3. 在專案清單中,選擇要上傳測試的專案。

    提示

    您可以使用搜尋列,依名稱篩選專案清單。

    若要建立專案,請遵循 中的指示 在 AWS Device Farm 中建立專案

  4. 選擇建立執行

  5. 選取應用程式和執行類型下,於執行類型區段中,選擇 iOS 應用程式

  6. 選取應用程式區段的應用程式選取選項中,選取上傳自己的應用程式。然後,選取上傳應用程式下的選擇檔案

  7. 瀏覽並選擇您的 iOS 應用程式檔案。該檔案必須是 .ipa 檔案。

    注意

    請確定您的 .ipa 檔案是針對 iOS 裝置所建置,而非模擬器。

  8. 設定測試下,在選取測試架構區段中,選擇 XCTest UI。然後,選取上傳應用程式下的選擇檔案

  9. 瀏覽並選擇包含 iOS XCTest UI 測試執行器的 .ipa 或 .zip 檔案。

  10. (選用) 若要設定執行層級屬性,請更新執行設定區段:

    1. 若要讓 Device Farm 在執行完成後產生 Test Insights 報告,請啟用產生測試報告。此選項僅適用於自訂測試環境。

      適用下列先決條件:

      1. 您的測試必須產生 Xcode .xcresult套件並將其寫入 $DEVICEFARM_DERIVED_DATA_PATH。例如,傳遞-derivedDataPath $DEVICEFARM_DERIVED_DATA_PATHxcodebuild。如果您保留預設組態,預設的 XCTest UI 測試規格會自動產生和存放此套件。

      如需檢視報告的詳細資訊,請參閱 檢視測試報告 (主控台)

  11. 完成執行建立程序中剩餘的步驟。選取您要測試的裝置,並選擇性地指定其他組態。

  12. 選擇建立執行。Device Farm 會執行您的測試,並在主控台中顯示結果。

檢視測試報告 (主控台)

  1. 登入 Device Farm 主控台,網址為 https://https://console.aws.amazon.com/devicefarm

  2. 在導覽窗格中,選擇行動裝置測試,然後選擇專案

  3. 選擇包含您要檢查之執行的專案。

  4. 選擇已完成的執行以開啟其詳細資訊。

  5. 選擇其中一個已完成的任務,以開啟該裝置的結果。

啟用測試洞見

任務結果包含測試報告索引標籤。選擇它以查看測試結果的摘要,包括測試總數、通過和失敗的數量、測試執行時間總計,以及測試執行時間中位數。在摘要下方,測試資料表會顯示每個測試的明細。

測試報告索引標籤上已完成 XCTest UI 任務的第一組資料欄。
已完成 XCTest UI 任務的測試報告索引標籤上的剩餘資料欄。

測試資料表中的每一列都包含下列資料欄:

  • 結果 – 無論測試通過、失敗或略過。

  • 測試類別 – 測試所屬的類別。

  • 測試名稱 – 測試方法的名稱。

  • 堆疊追蹤 – 針對失敗的測試,為失敗的堆疊追蹤連結。

  • 持續時間 – 測試執行所需的時間。

  • 開始時間結束時間 – 測試開始和結束的時間。

  • 架構結果 – 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 UI 任務的測試報告範例:

{ "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

測試的 Device Farm 結果,以及 XCTest 架構報告的結果字串。Device Farm 會映射frameworkResult至標準化result欄位。

durationSeconds, startTimestamp, endTimestamp

測試的持續時間,以秒為單位,以及開始和結束的時間。

testBundle, nodeIdentifier

測試所屬的測試套件,以及測試案例的 xcresult 節點識別符。

testArguments

對於參數化測試調用,則為調用的引數標籤。

stackTrace

對於失敗的測試,為失敗的堆疊追蹤。