cmux 測試規則,涵蓋 Swift Testing、測試目標編譯、測試接線,以及套件/重構驗證。在新增或修改測試、碰觸套件/重構程式碼,或判斷 reload.sh 是否足以作為驗證時使用。
cmux 測試
回歸測試提交政策
針對錯誤修正的回歸測試會分成兩個提交,讓 CI 證明測試能抓到錯誤:
- 只有失敗的測試,沒有修正。CI 顯示紅燈。
- 修正。CI 顯示綠燈。
GitHub PR 的 Commits 分頁接著會顯示,沒有修正時測試確實會失敗。
測試接線
cmuxTests/ 中的測試檔案必須接線到 cmux.xcodeproj/project.pbxproj,並有對應的 PBXFileReference 和 PBXSourcesBuildPhase 條目。如果新增的 .swift 檔案沒有這些條目,Xcode 會默默忽略它:xcodebuild test -only-testing:cmuxTests/<TestClass> 和 bot 審查都會以「Executed 0 tests」通過,因此缺少接線與乾淨的紅/綠回歸測試無法區分,直到真實使用者遇到錯誤。此問題在 https://github.com/manaflow-ai/cmux/issues/4529 中浮現,對應 https://github.com/manaflow-ai/cmux/pull/4536。
workflow-guard-tests CI 工作會執行 ./scripts/lint-pbxproj-test-wiring.sh。請透過 Xcode 新增檔案(拖入 cmuxTests target),或手動編輯 pbxproj 條目,並以已接線的同類檔案(例如 cmuxTests/TabManagerUnitTests.swift)作為範本。
測試品質政策
- 不接受只驗證原始碼文字、方法簽名、AST 片段或 grep 樣式的測試。
- 不接受讀取已提交的中繼資料或專案檔案(
Resources/Info.plist、project.pbxproj、.xcconfig、原始碼檔案)只為了斷言某個 key、字串、plist 條目或片段存在的測試。 - 測試必須透過可執行的路徑(單元、整合、端對端、CLI)驗證可觀察的執行時期行為,而不是實作形狀。
- 對於中繼資料變更,請驗證建置出的 app bundle,或依賴該中繼資料的執行時期行為。
- 如果某行為尚無法端對端執行,請先加入一個小的執行時期接縫或測試工具,再透過它進行測試。
- 如果沒有有意義的行為或產物層級測試可行,請跳過假回歸測試並說明原因。
測試框架
Swift Testing(Swift 6 / Xcode 16)是所有單元和整合測試的預設框架:import Testing、@Test、@Suite、#expect(...)、try #require(...)。不要撰寫新的 import XCTest 測試,除非是 UI 測試。
- UI 測試維持在 XCTest/XCUITest。 Swift Testing 沒有
XCUIApplication整合。cmuxUITests/下的檔案保留XCTestCase;不要遷移或橋接它們。 - 新的測試目標從 Swift Testing 開始。 每個新套件的
Tests/<Name>Tests/從第一個提交就使用它;Xcode 16 會從import Testing自動偵測框架,無需Package.swift設定。 - 參數化測試 使用
@Test(arguments: [...])而不是重複的方法。 - 平行化。 Swift Testing 預設會平行執行測試,包括跨 suite。需要排序或保護共享可變狀態的 suite 應使用
.serialized,而不是鎖或 sleep。 - 標籤 透過
@Test(.tags(.something))讓 CI 和本機執行可以選擇性過濾。 - 只有在編輯已經碰到現有 XCTest 檔案時,才就地遷移它。對應表請見 references/swift-testing-migration.md。
測試目標驗證
reload.sh 只建置 cmux scheme,因此綠色 reload 並不代表 cmuxTests/cmuxUITests 仍然可以編譯。移動或重新命名的符號可能讓 app 繼續建置,但破壞測試目標(實際案例:write(to:atomically:) 的拼字錯誤和移除的 TabManager.CommandResult 只在 tests 工作中浮現)。在推送套件/重構變更之前,請使用 -derivedDataPath /tmp/cmux-<tag> 建置 cmux-unit scheme(加上 cmuxApp/AppDelegate 變動的 GlobalISel 工作區旗標),或讓 tests CI 工作把關。
詳細參考
- references/swift-testing-migration.md:XCTest 到 Swift Testing 的轉換對應表。
- references/regression-and-quality.md:判斷測試是否夠行為導向。
- references/local-vs-ci-validation.md:在
reload.sh、cmux-unit、GitHub Actions、E2E/UI 測試和 Python socket 測試之間做選擇。 - references/remote-tmux-sizing-e2e.md:remote-tmux mirror sizing UI 測試套件、其 ssh shim、
remote.tmux.pane_grids/remote.tmux.test_exec除錯動詞,以及即時佈局模糊測試工具。






