本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將適用於 iOS 的 XCTest UI 與 Device Farm 整合
Device Farm 支援 XCTest UI 測試架構。具體而言,Device Farm 支援以 Objective-C 和 Swift
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 檔案:
-
建立名為
承載的目錄。 -
將您的應用程式目錄新增至承載目錄。
-
將承載目錄封存至
.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 主控台上傳您的測試。
登入 Device Farm 主控台,網址為 https://https://console.aws.amazon.com/devicefarm
。 -
在導覽窗格中,選擇行動裝置測試,然後選擇專案。
-
在專案清單中,選擇要上傳測試的專案。
提示
您可以使用搜尋列,依名稱篩選專案清單。
若要建立專案,請遵循 中的指示 在 AWS Device Farm 中建立專案
-
選擇建立執行。
-
在選取應用程式和執行類型下,於執行類型區段中,選擇 iOS 應用程式。
-
在選取應用程式區段的應用程式選取選項中,選取上傳自己的應用程式。然後,選取上傳應用程式下的選擇檔案。
-
瀏覽並選擇您的 iOS 應用程式檔案。該檔案必須是 .ipa 檔案。
注意
請確定您的 .ipa 檔案是針對 iOS 裝置所建置,而非模擬器。
-
在設定測試下,在選取測試架構區段中,選擇 XCTest UI。然後,選取上傳應用程式下的選擇檔案。
-
瀏覽並選擇包含 iOS XCTest UI 測試執行器的 .ipa 或 .zip 檔案。
-
(選用) 若要設定執行層級屬性,請更新執行設定區段:
-
若要讓 Device Farm 在執行完成後產生 Test Insights 報告,請啟用產生測試報告。此選項僅適用於自訂測試環境。
適用下列先決條件:
-
您的測試必須產生 Xcode
.xcresult套件並將其寫入$DEVICEFARM_DERIVED_DATA_PATH。例如,傳遞-derivedDataPath $DEVICEFARM_DERIVED_DATA_PATH至xcodebuild。如果您保留預設組態,預設的 XCTest UI 測試規格會自動產生和存放此套件。
如需檢視報告的詳細資訊,請參閱 檢視測試報告 (主控台)。
-
-
-
完成執行建立程序中剩餘的步驟。選取您要測試的裝置,並選擇性地指定其他組態。
-
選擇建立執行。Device Farm 會執行您的測試,並在主控台中顯示結果。
檢視測試報告 (主控台)
登入 Device Farm 主控台,網址為 https://https://console.aws.amazon.com/devicefarm
。 -
在導覽窗格中,選擇行動裝置測試,然後選擇專案。
-
選擇包含您要檢查之執行的專案。
-
選擇已完成的執行以開啟其詳細資訊。
-
選擇其中一個已完成的任務,以開啟該裝置的結果。
啟用測試洞見
任務結果包含測試報告索引標籤。選擇它以查看測試結果的摘要,包括測試總數、通過和失敗的數量、測試執行時間總計,以及測試執行時間中位數。在摘要下方,測試資料表會顯示每個測試的明細。
測試資料表中的每一列都包含下列資料欄:
-
結果 – 無論測試通過、失敗或略過。
-
測試類別 – 測試所屬的類別。
-
測試名稱 – 測試方法的名稱。
-
堆疊追蹤 – 針對失敗的測試,為失敗的堆疊追蹤連結。
-
持續時間 – 測試執行所需的時間。
-
開始時間和結束時間 – 測試開始和結束的時間。
-
架構結果 – XCTest 架構針對測試報告的結果字串。
-
測試套件 – 測試所屬的測試套件。
-
節點識別符 – 測試案例的 xcresult 節點識別符。
您可以依名稱、類別或狀態搜尋測試。若要選擇顯示的資料欄,請選擇設定圖示。在設定中,您可以選取要顯示的資料欄,並開啟或關閉依類別分組。依類別分組預設為開啟,這會依其測試類別分組測試。展開類別以查看其個別測試,如下列螢幕擷取畫面所示。
若要將完整測試報告下載為 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 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對於失敗的測試,為失敗的堆疊追蹤。