對於許多開發 iOS 的工程師來說,撰寫測試是確保品質的基石,但隨著專案規模擴大,測試套件的執行速度往往會變成開發流程中的瓶頸。DoorDash 最近分享了他們將龐大的 iOS 測試套件從舊有的 XCTest 遷移到新一代 Swift Testing 框架的實踐經驗。這不僅僅是語法上的更換,而是一次透過 AI 工具大幅提升開發效率與 CI 效能的工程實踐。
理解 XCTest 與 Swift Testing 的差異
在進入遷移細節前,我們得先理解這兩個框架的背景。XCTest 是 Apple 長年提供的測試框架,雖然功能完整,但其執行模式大多是序列化的(Sequential),也就是一個接一個執行。當測試數量達到數千個時,這種模式會導致持續整合(CI, Continuous Integration)管道極其緩慢,開發者必須花費大量時間等待測試結果。
而 Swift Testing 是 Apple 近期推出的現代化測試框架。它最大的優勢在於原生支持並行執行(Parallel Execution),無論是同步還是非同步代碼都能同時運行。此外,它引入了像 #expect 這樣的宏(Macro),能提供更豐富的錯誤診斷訊息,讓工程師在測試失敗時能更快定位問題,而不是面對模糊的失敗提示。
AI 驅動的遷移策略
面對海量的測試案例,手動修改語法是不切實際的。DoorDash 採取了 AI 輔助的自動化路徑,核心工具組合包括 Cursor(一個 AI 驅動的程式碼編輯器)、SweetPad(用於在 VS Code 中整合 Xcode 功能)以及自定義的 MCP 伺服器(Model Context Protocol,一種讓 AI 能與外部工具溝通的標準協議)。
為了讓 AI 能夠精準地完成遷移,他們定義了一套遷移規則(Migration Rule)。這套規則將機械式的轉換過程自動化,包括修改 import 語句、將 XCTAssert 轉換為 #expect、插入 @Test 標記以及處理 async/await 的非同步邏輯。這樣一來,工程師不需要在瑣碎的語法轉換上浪費時間,而能將注意力集中在驗證邏輯的正確性上。
確保遷移可靠性的防禦機制
使用 AI 生成代碼最擔心的就是幻覺或不可預測的錯誤。為了防止遷移後的測試出現不穩定(Flakiness)的情況,DoorDash 設定了嚴格的可靠性門檻:每一個遷移後的測試案例必須連續通過 10 次執行,才能被正式採納。
在遷移過程中,他們還引入了 Bazel(一個高效能的開源構建與測試工具)。他們將 Bazel 的測試指令直接整合進 AI 的提示詞(Prompt)中,讓 AI Agent 能在本地端自主執行測試、發現錯誤、修正代碼,並重複此循環直到測試完全通過。
並行執行揭露的隱藏問題
這次遷移也揭露了一個重要的技術細節:當測試從 XCTest 的序列執行轉變為 Swift Testing 的並行執行時,許多原本被掩蓋的 Bug 浮現了。例如,某些測試依賴於特定的執行順序,或者存在共享狀態(Shared State)的競爭問題。這些問題在舊框架中因為一個接一個執行而沒被發現,但在並行環境下立即爆發。這反而促使團隊清理了不健康的測試代碼,提升了整體代碼品質。
量化成效與實務影響
這次遷移為 DoorDash 帶來了顯著的量化收益。在 CI 環境中,測試執行速度提升了約 60%,整體構建時間縮短了 40%。對工程師而言,這意味著更短的等待時間與更快的迭代週期;對公司而言,則降低了 CI 基礎設施的運算成本。
總結來說,這次實踐證明了 AI Copilot 在處理大規模舊代碼遷移時的強大潛力,但關鍵不在於 AI 本身,而是在於周圍建立的可靠性機制,包括自動化的驗證循環、嚴格的通過標準以及對底層構建工具的深度整合。
來源:infoq.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。