cmux-testing

cmux-testing

熱門

cmux 測試規則,涵蓋 Swift Testing、測試目標編譯、測試接線,以及套件/重構驗證。在新增或修改測試、碰觸套件/重構程式碼,或判斷 reload.sh 是否足以作為驗證時使用。

2.5萬星標
2116分支
更新於 2026/7/31
SKILL.md
唯讀
名稱
cmux-testing
描述

cmux 測試規則,涵蓋 Swift Testing、測試目標編譯、測試接線,以及套件/重構驗證。在新增或修改測試、碰觸套件/重構程式碼,或判斷 reload.sh 是否足以作為驗證時使用。

cmux 測試

回歸測試提交政策

針對錯誤修正的回歸測試會分成兩個提交,讓 CI 證明測試能抓到錯誤:

  1. 只有失敗的測試,沒有修正。CI 顯示紅燈。
  2. 修正。CI 顯示綠燈。

GitHub PR 的 Commits 分頁接著會顯示,沒有修正時測試確實會失敗。

測試接線

cmuxTests/ 中的測試檔案必須接線到 cmux.xcodeproj/project.pbxproj,並有對應的 PBXFileReferencePBXSourcesBuildPhase 條目。如果新增的 .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.plistproject.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 工作把關。

詳細參考