XCTestがXcodeでテストを作成するための好ましい方法のままである一方で、新しいSwift Testingフレームワークは、Swiftがサポートされている全てのプラットフォームに適用される、テストの定義のための表現力豊かで直感的なAPIを導入しようとしている。フレームワークはまた、パラメトリック化、並列化、分類、テストとバグの関連付けを可能にする。
Swift Testingは、複雑な振る舞いを宣言する慣用的な方法を提供するために、マクロを広範囲に利用する。例えば、これは名前と、それに対して実行されるべき代替入力のセットでテストを宣言する方法だ。
import Testing
...
@Test("Sample test", arguments: [
"input string 1",
"input string 2",
"input string 3"
])
func sampleTest(sampleInput: String) {
...
}
上記のテストは3回実行され、それぞれの呼び出しがsampleInput
パラメータを通して提供された引数の1つを受け取る。テストをパラメータ化する際には、複数の入力を扱うこともできる。この場合、@Test
のarguments
にはコレクションのリストを指定し、テスト関数はそれぞれのコレクションから、2つのコレクションの値の可能な組み合わせごとに引数を受け取ることになる。
@Test("Multiple collections as test inputs", arguments: 0...100, ["a", ..., "z"])
func test(number: Int, letter: String) {
}
arguments
型に対する特定の条件下で、パラメトリックなテストを選択的に実行可能であり、入力値の可能なすべての組み合わせに対してテストを実行する必要がない。
オプションで名前と引数のリストを指定するだけでなく、@Test
マクロはテスト関数にtraits を関連付けることもサポートしている。既存の特質により、実行時の条件に基づいてテストを有効または無効にしたり、テストの実行時間を制限したり、テストを連続または並行して実行したり、テストをバグに関連付けたりすることができる。例えば、あるアプリの機能が有効になっている場合にのみテストを実行するには、次のようにする。
@Test(.enabled(if: App.ConditionToMatch))
func conditionalTest() {
...
}
開発者は、testtraitに準拠した型を実装することで、独自の特性を定義できる。
テストをパラメータ化することで、失敗した場合に生成される診断が、失敗した入力を明確に示すという利点もある。
テスト関数は、テスト・スイートにまとめることができる。これを行う伝統的な方法は、同じテストclass
にそれらを配置することである。Swift Testing はそのための特別なマクロ@Suite
も提供する。テストスイートに属するすべてのテスト関数は、tags(_:)
やdisabled(_:sourceLocation:)
を含む、スイートから同じ特徴を継承する。
テスト結果を検証するために、Swift Testingは2つのマクロexpect(_:_:sourceLocation:)
とrequire(_:_:sourceLocation:)
を提供する。require
はその条件が満たされないときに例外を投げてテストの実行を停止するが、expect
は詳細な情報を表示する。
重要な注意点として、リリース用にビルドする際、テスト関数はバイナリから取り除かれない。このため、Appleはテスト・ライブラリをメインの実行ファイルとリンクされていないテスト・ターゲットにインポートすることを強く勧めている。
Swift TestingはGitHubと、 Swift Package Indexで入手可能で、Swift 6が必要だ。XCTestとSwift Testingは同じプロジェクトで共存できるので、新しいフレームワークを採用したい場合、必ずしも既存のテストを移行する必要はない。