2026 日次レンタル Mac で Swift Testing 移行:XCTest 共存戦略、#expect 対照表と 1~3 日の意思決定マトリクス
Xcode 26 に @Test テンプレートが出ても、数千の XCTestCase を一日で消す勇気はない——UI Test と Performance は XCTest に残るのが現実です。主力 Mac には証明書と実験ブランチが同居し、テスト target 全置換は CI を一週間赤くします。本稿は1~3 日で単体を Swift Testing に載せつつ混合スタックを維持する iOS リード向けに、3 つの痛み、共存マトリクス、7 ステップ、分診表、3 指標を示し、Swift 6 厳格並行性、CI macOS ノード、SSH/VNC FAQへつなぎます。
目次
01. 三つの痛み
1)DerivedData とテストキャッシュの「串味」:Swift Testing はデフォルト並列。旧 XCTest の直列前提・グローバルシングルトン・共有 UserDefaults と衝突するとフレークが出ます。主力機でアプリとテストを同時に触ると原因切り分けが困難です。
2)UI/Performance まで Swift Testing に寄せようとする:Xcode 26 時点でUI 自動化とベンチは XCTest 依存。境界を文書化しないとスコープが膨らみます。
3)ローカルは緑、CI は旧 scheme:新 target が Test action に無い、-only-testing が旧クラスを指す——第 2 台のクリーン Macが無いと「フレームワークが不安定」と誤診します。
02. Swift Testing vs XCTest 共存マトリクス
| 種別 | 推奨 | レンタル Mac での検収 |
|---|---|---|
| 純 Swift 単体(UI なし) | Swift Testing 優先 | 並列下の共有 mutable なし;Sendable 境界 |
| 引数駆動 | @Test(arguments:) | 失敗インデックスと CI ログ |
| UI / XCUITest | XCTest 維持 | Test Plan 分離、シミュレータ競合回避 |
| Performance | XCTest 維持 | CPU 独占ウィンドウで baseline |
| SPM testTarget | Swift Testing + swift test | xcodebuild test も緑 |
03. #expect 対照
import Testing
struct TierTests {
@Test(arguments: [0, 1, 99])
func label(for count: Int) {
#expect(!PriceTier.label(for: count).isEmpty)
}
@Test(.tags(.integration))
func checkout() async throws {
let cart = try #require(await CartBuilder.makeSample())
#expect(cart.itemCount > 0)
}
}
04. 7 ステップ Runbook
- 固定:
xcodebuild -version、各 test target のSWIFT_VERSION。並行で並行性作業するなら Swift 6 Runbook を先読み。 - 共存:
*UITests/ Performance は残し、Swift Testing 単体 target を新設。Day1 で XCTest 削除禁止。 - バッチ移行:UIKit/シングルトン無しの純ロジックから。≤30 ケース/バッチ。
- 並列と tag:Keychain・ファイル・ネットワークは
.serializedまたは tag。 - CI 整合:scheme と
-parallel-testing-enabled。CI ノード と Xcode パッチ一致。 - 証跡:
xcresultで二重フレームワーク同時緑を証明。 - 消去:鍵・DerivedData 削除。SSH/VNC FAQ で帯域確認。
xcodebuild test -scheme YourApp \
-destination 'platform=iOS Simulator,name=iPhone 16,OS=latest' \
-parallel-testing-enabled YES \
-resultBundlePath ./TestResults.xcresult
swift test --parallel
05. 分診表と 3 指標
| 症状 | 最初の一手 | NG |
|---|---|---|
| ローカル緑・CI 赤 | scheme Test action と CI 引数を比較 | CI で並列を無効化して隠す |
| 移行後のランダム赤 | serialized / 独立 UserDefaults | グローバルに並列オフ |
| Testing モジュール不明 | test target に Testing、Swift ≥ 6 | App target に @Test |
- 指標1:単体の 45~70% が初回移行候補(UI/Performance 除く)。
- 指標2:並列化で全量 test が 15~40% 短縮しうる(Apple Silicon)。
- 指標3:レンタル機で二重緑+xcresult 後、2 週間のテスト関連 revert 議論が約 25% 減る例。
1 日目:固定・共存・首批。2 日目:引数化・tag・CI。3 日目:証跡・XCTest 残存リスト・消去。
06. Linux CI vs 日次レンタル Mac
Linux の swift test は一部に有効ですが、iOS Simulator・Test Plan・UI Test 編排は Xcode 前提です。SSH のみだと Test navigator が使えず切り分けが遅れます。
主力環境と切り離した再現可能な二重フレームワーク検収には Apple Silicon + Xcode 26 が向きます。日次レンタルで CAPEX を 1~3 日に圧縮。料金ガイド と FAQ を併読してください。
07. FAQ
Q:長期共存は?推奨。UI/Performance の公式代替まで XCTest を残す。
Q:引数失敗の特定は?xcresult のインデックスと -resultBundlePath 成果物。
Q:Sendable 衝突は?レンタル機で test target を complete モードで実行。
Q:ディスク?空き 15 GB 未満 でシミュレータと並列 test が遅くなります。