Xcode 16 Betaの「Testing」の紹介 - 主に「Swift Testing」について
Xcode 16 Betaリリース
今年もWWDC24の時期になり、Xcode 16 Betaのリリースノートが公開されました。
今回のリリースノートでは「Test Report」「Testing」「XCTest」という項目があります。
「XCTest」には新たに追加されたAPIについての話が記載されています。
この話もしたいところですが、今回の(私にとっての)最大の目玉は「Testing」に記載されている「Swift Testing」といっても過言ではないでしょう。
そこで、本記事ではpublicに公開されているリリースノートやドキュメントに記載された内容をベースに「Testing」の箇所について紹介していきます。
なお、正式リリース後に追加の記事を書きたいと思います。
「Testing」項目の抜粋
Testingに記載されている内容を抜粋して書くと次のような感じです。
Xcode 16からSwiftのために作られたTesting Frameworkである「Swift Testing」が含まれるようになりました
#expectを使用するとテストが失敗したときに詳細な結果を教えてくれます
parameterized testsがサポートされました
XCTestとSwift Testingのテストの両方をテスト対象とできます
テストプラン(Test Plans)のサポート強化
「Swift Testing」で実装されたテストコードを実行の対象、非対象にすることができます
タグ単位で実行の対象、非対象にすることができますが、デフォルトはすべてが対象です
実行対象、対象外のテストの数が下部のバーに表示されます
テストナビゲーター(Test Navigator)のサポート強化
parameterized testsで渡した引数単位で表示されます(サポート範囲はSwift Testingのドキュメントを参照)
フィルターに「以前に実行されたことがある」「一度も実行されていない」が追加されました
タグを適用している場合、タグによってグループ化されたものが表示されます
このリリースノートを見ると分かると思いますが、Swift Testingを中心とした内容になっています。
そこで、ここで頻繁に登場してくる「Swift Testing」について軽く説明をします。
Swift Testingについての参考資料
「swift-testing」というライブラリ自体は以前から公開され、注目を浴びていました。
すでにこのライブラリについて紹介してくれている記事があります。
この記事を読めば、大枠は分かるかと思います。
Appleからの公式資料として次のようにセッションならびにドキュメントがあります。
ぜひともこちらも確認してもらえればと思います。
参考資料
セッション
ドキュメント
Swift Testingのサンプルコードをもとに紹介
今後、自動テストはXCTestではなくSwift Testingを利用して実装するのが一般的になるかと思われます。
そこで、かんたんにSwift Testingのサンプルコードをもとに紹介しておきたいと思います。
他のTesting Frameworkを利用していた方、XCTestのAPIを理解している方ならサンプルコードを読めばある程度、分かるのではないかと思います。
サンプルコードは次のSwift Testingのドキュメントにあるコードを元に記載しています。
実際に、手元で試してみてもらうとより良さがわかるかと思うので是非ともお手元の環境で試してみてください。
サンプルコードと説明
import Testing
// Point 1
struct FoodTruckTests {
/ Point 2
@Test func sample1() { ... }
// Point 3
@Test("さんぷる", .tags(.legallyRequired)) func sample2() { ... }
// Point 4
@Test("All foods available", arguments: [Food.burger, .iceCream, .burrito])
func foodAvailable(_ food: Food) async throws { ... }
}
上記のサンプルコードを元にXCTestとの変更点を大まかに紹介していきます。
Point 1
今まで(XCTest)は次のような形で記載していましたが、XCTestCaseクラスを継承したクラスを用意していましたが、そうする必要はなくなりました
class FoodTruckTests: XCTestCase { ... }
Point 2
今まではテストケース名は `test` というprefixを付ける必要がありましたが、`@Test` を使うことでその必要はなくなりました
Point 3
JUnit5の `@DisplayName` のようにテストケース名を別途設定することができるようになりました
`.tags` を使うことでグルーピングができるようになりました
Point 4
parameterized testsがサポートされ、設定した値を順次渡すことができます
ここで述べたのはあくまでSwift Testingの一部です。
他にもあるので、ぜひともドキュメントなどを参照してみてください。
Xcodeとの連携
「Swift Testing」というTesting Frameworkそのものについての良さは上述したとおりです(一部ですが)。
今回のXcodeのリリースノートに記載されているとおりですが、Swift Testingだけでなく、それがXcodeを中心とした実行基盤周りとの連携が今回の重要点といえます。
Appleは、自動テストに関してAPIの追加とかだけでなく実行基盤において、今までいろいろなものを提供してきています。
その歴史についてはiOSDC 2023でポスター発表した際の資料があるので、それを見ていただければと思います。
テストコードの実装のしやすさ(書きやすさ)も大事ですが、その実行の仕方も重要です。
今回の連携によってTest Plansを中心としたテストコードの扱いが以前より良くなったと言えます。
おわり
最初に記載したとおり、まだBetaリリースの状態なので、そこまで多くの情報は記載しませんが、正式リリース後に再度記事を書こうと思います。
今回の「Swift Testing」によってiOSアプリ開発における自動テストがより活用しやすくなったと言えるかと思います。
すでに上述したとおりですが、自動テストをより活用するには実装のしやすさだけでなく、Xcodeを中心とした実行基盤周りとの連携によるものがあります。
今まで提供されていたものをより活用する機会といえます。
これによって、より自動テストを活用する機運となればいいなと思う次第です。
早く実践投入したいですね!!!