テストとコード品質

Swift Testing:XCTestに代わるAppleの新しい標準(要点まとめ)

iOS開発でテストコードを書いていると、XCTestに少しもどかしさを感じることがあります。

読了 4 分
Swift Testing:XCTestに代わるAppleの新しい標準(要点まとめ)のカバー画像

iOS開発でテストコードを書いていると、XCTestに少しもどかしさを感じることがあります。

私もそうでした。func testで始まる関数名、XCTAssertEqualのような冗長なアサーション、失敗時に何が問題か一目で分かりにくいメッセージまであります。

そんな中、AppleはWWDC 2024でSwift Testingという新しいフレームワークを発表しました。

結論から言うと、Swift TestingはXCTestに代わるApple公式の新しい標準です。@Testマクロと#expectだけで、より簡潔にテストを書けます。Xcode 16から標準搭載されています。

この記事では、Swift Testingとは何か、XCTestと何が違うのか、今すぐ使ってよいのかを、実際に使った経験をもとにまとめます。

Swift Testingとは?

Swift Testingは、AppleがWWDC 2024で公開したオープンソースのテストフレームワークです。

Swiftの最新機能の一つであるマクロを積極的に活用して作られています。

従来のXCTestがObjective-C時代にルーツを持つのに対し、Swift Testingは最初からSwiftらしく設計されている点が最大の違いです。

Xcode 16以降は、別途インストールせず標準で利用できます。Swiftパッケージからもすぐに使えます。

最も目立つのは構文です。テスト関数名をtestで始める必要がなくなりました。

代わりに関数の上へ@Testを付けると、それがテストになります。

import Testing

@Test func カート_の_合計が正しいか() {
    let cart = Cart(items: [1000, 2000])
    #expect(cart.total == 3000)  // 失敗すると実際の値も表示
}

上のコードのように、#expectの中へ普通の比較式をそのまま書けます。XCTAssertEqualやXCTAssertTrueを覚える必要はありません。


XCTestとの違いは?

自分で移行して感じた主な違いを表にまとめました。(2026年時点)

項目 XCTest Swift Testing
テストの宣言 func testで始める @Testマクロ
アサーション XCTAssertEqualなど複数 #expectに統一
失敗メッセージ 値が分かりにくい 実際の値を自動表示
繰り返しテスト for文を手動で書く パラメータ化を標準サポート
並列実行 限定的 標準で並列実行

特に感動したのはパラメータ化テストです。

同じロジックを値だけ変えて何度も検証するとき、以前はfor文を回すか、関数をコピーしていました。

Swift Testingでは、@Testに引数の一覧を渡すだけで、それぞれ自動実行してくれます。

失敗したケースがどの値だったのかも正確に示してくれます。

今すぐ使っても大丈夫?

はい。新規プロジェクトなら、今すぐ導入することをおすすめします。

Xcode 16以降、Swift 6の環境なら、設定らしい設定はほとんどありません。

ただし、知っておきたい点があります。Swift TestingとXCTestは同じプロジェクトで共存できます。

既存のXCTestコードを一晩で全て書き換える必要はないということです。

新しく書くテストだけSwift Testingを使い、既存のものは少しずつ移行すれば十分です。

新しいテストから一つずつ移行すれば十分です
新しいテストから一つずつ移行すれば十分です

一つ注意したいのはUIテストです。画面を自動操作するXCUITest系は、まだXCTestの領域にあります。

そのため当面は、ユニットテストにSwift Testing、UIテストにXCTestという組み合わせが現実的です。


移行時に知っておきたいこと

実際に移行して役立ったヒントをいくつか紹介します。

まず、setUpとtearDownの代わりにinitとdeinitを使います。Swift Testingはテストごとに新しいインスタンスを作るためです。

そのため、テスト間で状態が混ざるミスを大幅に減らせます。

次の段階へ進むために値が必ず必要な場合は、#expectではなく#requireを使います。

条件を満たさなければ、#requireはその場でテストを停止します。

緑のランプを見ると、@Testが意外と癖になります
緑のランプを見ると、@Testが意外と癖になります

タグ(Tag)機能も便利です。関連するテストをまとめて一度に実行したり、絞り込んだりできます。

エラーが正しくスローされるか確認するときは、#expect(throws:)を使います。

まとめ

Swift Testingは登場したばかりの実験的機能ではなく、Appleが推進する次の標準です。

すぐに全てを変える必要はありませんが、新しいテストから少しずつ使えば、その便利さにすぐ慣れるでしょう。

iOSのテストコードに不満を感じているなら、今日一つだけ@Testへ移してみることをおすすめします。

あわせて読みたい