ノートPCで単体テストを実行する様子。隔離 macOS で Swift Testing と XCTest を検証するイメージ

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 / XCUITestXCTest 維持Test Plan 分離、シミュレータ競合回避
PerformanceXCTest 維持CPU 独占ウィンドウで baseline
SPM testTargetSwift Testing + swift testxcodebuild 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

  1. 固定:xcodebuild -version、各 test target の SWIFT_VERSION。並行で並行性作業するなら Swift 6 Runbook を先読み。
  2. 共存:*UITests / Performance は残し、Swift Testing 単体 target を新設。Day1 で XCTest 削除禁止。
  3. バッチ移行:UIKit/シングルトン無しの純ロジックから。≤30 ケース/バッチ。
  4. 並列と tag:Keychain・ファイル・ネットワークは .serialized または tag。
  5. CI 整合:scheme と -parallel-testing-enabledCI ノード と Xcode パッチ一致。
  6. 証跡:xcresult で二重フレームワーク同時緑を証明。
  7. 消去:鍵・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 ≥ 6App 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 が遅くなります。