首頁 / 部落格 / iOS 自動化測試伺服器怎麼搭?
ENGINEERING_BLOG · 2026.08.24

iOS 自動化測試伺服器怎麼搭?2026 遠端 Mac 教學

Apple 官方文件明確記載,xcodebuild 能從命令列執行測試,而測試結果可保存為 xcresult 結果包;因此,iOS 自動化測試伺服器不需要取代你的日常開發機。最穩妥的做法是「本地編碼、遠端 Mac 自動測試」:先讓一個 Scheme 在一個 Simulator destination 上跑通,再接入 Test Plan、結果保存與定時任務。低頻回歸按需啟動,只有每日測試、多個 Simulator 或無人值守工作,才值得維持常駐環境。Apple 命令列測試文件

這篇適合使用 Windows 或 Linux 編寫跨平台程式、但必須執行 iOS 測試的獨立開發者;也適合想把耗時 XCTest 或 UI 測試移出日常開發機的單人 App 作者。若你正在建立小型、可恢復的測試環境,但還不需要複雜 CI 平台,可以直接按下列里程碑驗收。

SECTION 01 動手前的環境邊界

先把工作拆成兩端,而不是一開始就把整個專案搬到遠端 Mac:

工作環節 本地開發機 遠端 Mac
編寫 Swift、跨平台程式與檢視差異 主要位置 非必要
解析依賴、建置測試產物 可做快速檢查 主要執行位置
Simulator 上執行 XCTest 與 UI 測試 只保留需要互動的檢查 自動測試主位置
查看日誌、測試結果與失敗截圖 透過下載結果分析 保存原始產物
定時回歸、失敗重跑與重啟後接續任務 通常不適合 適合長時間執行

你的第一個決策不是選多少台機器,而是先寫下測試類型、觸發頻率、目標系統版本與成功標準。專案現有 Scheme 和 Test Plan 應作為基線;遠端 Mac 上的 macOS、Xcode 與 Simulator Runtime 必須依照 Xcode 系統要求與相容矩陣核對,不能只看「能否開啟 Xcode」。

沒有本地 Mac,能不能跑 iOS 單元測試和 UI 測試?
可以,但遠端環境必須具備能執行 Xcode 測試的 macOS、相符的 Simulator Runtime,以及可供專案建置的依賴。單元測試通常先適合透過命令列驗證;UI 測試還要額外確認模擬器啟動、圖形工作階段、權限與測試資料是否穩定。這不是把 Windows 或 Linux 遙控成 macOS,而是把真正的測試執行端放到遠端 Mac。

若你仍未決定按需或常駐,可先查看 VPSNIX 的遠端 Mac 方案,但不要先買長期方案再反過來遷移專案。先用最小測試入口完成驗收,才能知道你的測試是否需要持續在線。

SECTION 02 第一個工作時段:固定測試工具鏈

在遠端 Mac 建立獨立測試帳號、專案目錄與暫存產物目錄。不要把個人日常設定、桌面檔案和測試輸出混在一起,否則日後清理快取或重啟主機時,很難判斷哪些資料可以刪除。

依序核對以下項目:

  • sw_vers:確認 macOS 版本,並與 Xcode 官方系統要求比對。
  • xcodebuild -version:確認實際使用的 Xcode。
  • xcode-select -p:確認命令列工具是否指向預期的開發者目錄。
  • xcrun simctl list:確認目標 Simulator device 與 Runtime 是否存在。
  • 依專案方式恢復 Swift Package、CocoaPods 或其它依賴,並記錄恢復失敗時的完整輸出。

若缺少目標 Runtime,應先按照 Apple 新增 Simulator Runtime 的說明補齊,再執行測試。不要用「版本差不多」推測相容性;Xcode、macOS 與 Runtime 的組合一旦不符,錯誤可能看似來自測試程式,實際上卻發生在建置或模擬器啟動階段。

SSH 適合下指令、拉取程式碼和收集日誌;需要檢查模擬器畫面、權限提示或 UI 互動時,則要透過遠端桌面或網頁控制台確認圖形工作階段。iOS 模擬器測試伺服器是否一定要保持圖形工作階段?
不要先下定論。命令列測試可由遠端工作階段觸發,但 UI 測試是否能穩定執行,仍取決於專案、Simulator 狀態與主機的圖形工作階段設定。你的驗收標準應是:在實際連線方式下,能啟動 Simulator、完成測試,並於斷開遠端畫面後仍留下可分析的結果,而不是只驗證 SSH 能登入。

SECTION 03 首次執行:單一 Scheme 與明確 destination

先從共享 Scheme 和一個已知的 destination 開始。以下命令只使用占位符,請替換成自己的專案名稱、Scheme 與裝置識別資訊:

xcodebuild \
  -workspace "<WORKSPACE>.xcworkspace" \
  -scheme "<SCHEME>" \
  -destination 'platform=iOS Simulator,id=<SIMULATOR_ID>' \
  test \
  -resultBundlePath "<RESULTS_DIR>/<RUN_ID>.xcresult"

這一步要同時驗證三件事:專案是否能完成建置、測試程序是否真的啟動,以及命令結束狀態是否能被腳本正確判斷。不要只看終端機最後一行「Test Suite Passed」;應保存標準輸出與錯誤輸出,並讓排程器依退出狀態判斷成功或失敗。Apple 的命令列建置與測試說明可作為參數核對依據。

怎樣用 xcodebuild 在遠端 Mac 自動執行 XCTest?
xcodebuild test 放入一個可重複的 Shell 腳本,由 SSH、排程工具或你現有的工作流程觸發。初次執行不要把整個測試套件一次放入;先用 -only-testing:<TEST_TARGET>/<TEST_CLASS> 或更小的測試範圍確認鏈路,再逐步擴大。實際參數名稱與行為應以當前 Xcode 文件和 xcodebuild -help 輸出為準。

通過單一測試入口後,再把測試分成不同 Test Plan,例如快速單元測試、完整回歸測試與發布前檢查。Test Plan 的價值不是增加配置檔,而是讓你能明確選擇測試集合、環境設定與執行目的;Apple 的 Test Plan 組織指南也將測試分組視為改善回饋速度的方式。

提醒: build-for-testingtest-without-building 可將建置測試產物和執行測試拆開,但不要因此假定所有測試都能安全共用舊產物。依賴、Scheme、Runtime 或編譯設定改變後,應重新建置,否則失敗證據可能對應不到目前的程式碼。

SECTION 04 首次 UI 測試:固定模擬器狀態

XCTest 單元測試通過,不代表 UI 測試已具備伺服器品質。先固定裝置類型、系統版本、語言、權限提示處理方式與測試資料;不要讓上一輪測試留下的登入狀態、通知授權或資料庫內容影響下一輪。

每次失敗都先分類,而不是直接增加主機資源:

  • 應用程式缺陷:同一測試在乾淨狀態重現,且錯誤指向產品行為。
  • 測試程式問題:等待條件不足、查找元素不穩定或測試資料不完整。
  • Simulator 狀態問題:裝置殘留、權限、啟動失敗或資料未清理。
  • 遠端工作階段問題:圖形工作階段中斷、主機重啟或命令被截斷。

清理 DerivedData、重設 Simulator 或刪除測試資料的影響範圍不同。破壞性清理前先保存日誌、截圖和當次 xcresult;否則你可能消除了失敗現場,卻仍不知道真正原因。Apple 對 Simulator 與實體裝置的執行方式有不同說明,可參考執行 App 的官方文件

SECTION 05 無人值守的結果與失敗證據

讓每次工作都產生固定結構的輸出,例如:

<ARTIFACTS>/
  <RUN_ID>.xcresult
  stdout.log
  stderr.log
  screenshots/
  video/
  metadata.txt

xcresult 可包含測試結果及相關日誌,並能在日後載入 Xcode 分析;Apple 的測試結果查看文件說明了結果檢視方式。較早期的官方說明也記載了結果包與 xcresulttool 的使用方向。結果包與 xcresulttool 文件

遠端測試生成的 xcresult 要怎樣保存和查看?
先在命令中用 -resultBundlePath 指定唯一輸出路徑,工作結束後依退出狀態決定保留或標記失敗,再把整個 .xcresult 目錄下載到本地 Xcode 開啟。若只複製其中一個檔案,可能遺漏結果包內的結構;若只保留文字日誌,則會失去部分測試詳情、覆蓋率或附件資訊。結果包能提供線索,但不能承諾每次失敗都能單靠它定位,因此 UI 截圖、錄影和主機日誌仍有價值。

失敗流程至少要有三個出口:通知你工作失敗、保留可診斷產物,以及提供只重跑失敗測試的入口。測試重複功能可用來辨識偶發失敗,但重跑通過不等於問題消失;Apple 的測試重複說明可用於核對相關行為。

SECTION 06 第一週的穩定性里程碑

完成一次成功執行後,第一週不要急著提高並行數。先讓真實專案依序完成拉取程式碼、恢復依賴、執行測試、匯出結果和失敗重跑,再檢查以下維護項目:

  • Simulator 是否留下異常裝置或未結束程序。
  • DerivedData 和結果包是否持續增長,並有明確保留與清理規則。
  • SSH 中斷後,測試是否仍能完成,結果是否仍可取得。
  • 遠端 Mac 重啟後,是否能重新登入、啟動必要服務並接收下一個任務。
  • 串行執行是否已足夠;只有在測試彼此隔離、資源和裝置條件都驗證後,才評估並行。

依條件選擇運作模式

  • 若每週只做少量回歸,且等待測試完成不影響交付,選按需租用;測試完成後釋放環境,避免為閒置時間付費。
  • 若每天需要 XCTest 或 UI 回歸,選常駐遠端 Mac;固定工具鏈與模擬器狀態,讓夜間任務不依賴你的本地電腦在線。
  • 若只有部分測試需要 macOS,選分層方案;本地或既有環境處理跨平台檢查,遠端 Mac 集中處理 iOS Simulator 測試。
  • 若測試必須接觸實體裝置、特殊 USB 配件或本地硬體,先回退到具備該物理介面的方案;遠端 Mac 並不自動解決硬體連接限制。
  • 若專案每天都有大量且穩定的長時間負載,先比較自購硬體與長租總成本;租用的優勢主要在快速取得 macOS、免除硬體維護和按需調整,而不是保證任何負載都更便宜。

當你完成最小測試鏈路後,再根據實際執行頻率評估 VPSNIX 的租用週期與方案。開通前應確認可用的 Xcode、Simulator Runtime、連線方式,以及重啟後能否恢復測試;若需要進一步核對操作條件,可查看 VPSNIX 說明中心

如果你現在的做法是讓本地 Windows 或 Linux 電腦長時間等待遠端命令、手動開啟測試,常見缺點是測試執行受個人電腦在線狀態影響、失敗產物容易散落,而且每次環境差異都可能讓問題難以重現。若改用自購 Mac,則還要承擔一次性硬體支出、macOS/Xcode 維護與閒置成本。對需要偶爾回歸的獨立開發者,短期租用 VPSNIX 的遠端 Mac 通常更容易先驗證流程;對每日 XCTest、UI 測試或夜間任務,則可在驗收成功後比較常駐租期,讓測試環境真正脫離你的桌面電腦。

延伸閱讀