🔎
Swift-Testingをキャッチアップする
Swift-Testingをキャッチアップ
Swift6のテストライブラリSwift-Testing
について基本的な概念をまとめました。
記法
Test.swift
// `Testing`モジュールをインポート
import Testing
@testable import Your_Module
// @Test(Attached Macro)マクロを使ってテスト関数を宣言
@Test func videoMetadata() {
let video = Video(fileName: "...")
let expectedMetadata = Metadata(duration: .seconds(90))
// #expect(Expression Macro)がXCTAssert系メソッドの代替になる。
#excpect(video.metadata == expectedMetadata
}
// 後から探しやすいようにテストケースの名前を変更
@Test("Check video metadata") func videoMetadata() { ... }
// 非同期な処理や失敗するかもしれない処理はasync throws をマークすることもできる
@Test func rating() async throws { ... }
// structでラップすることもできる
struct VideoTests {
@Test func ...
@Test func ...
@Test func ...
}
// 条件がfalseの時にテストを停止させる。
try #require(...)
// Optionalな値のアンラップも可能
let method = try #require(paymentMethods.first) // paymentMethods.first がnilの場合は実行されない
#expect(method.isDefault)
// traits: https://developer.apple.com/documentation/testing/traits
@Test("Custom Name")
@Test(.bug("example.com/issues/99999", "Title"))
@Test(.tags(.critical))
@Test(.enabled(if: Server.isOnline))
@Test(.disabled("Currently broken"))
@Test(...) @available(iOS 15.0, *)
@Test(.timelimit(.minutes(3))
// classだけでなくsturct、actorでテストをまとめることができる
struct MediumTest {
// @Suiteを使ってtagsなどの特徴を指定、継承させることができる
@Suite(.tags("写真のテスト"))
struct PhotoTest {
@Test func photoMetadata() { ... }
}
}
従来のXCTestとの比較
XCTest
はXCTAssert
系メソッドが40個以上存在していた
Swift Testingでは#expect
と#require
マクロの二つで表現できるようになった。テストに失敗したときの情報量も増える。
class
以外のstruct
、actor
でテストスイートを定義できるようになったり、setUp()
系メソッドがinit()
に置き換わるなど、Swiftライクな書き心地になりました。
Not
以下の動作はサポートされていません。
-
XCTAssert
...系メソッドをSwift Testingのテストから呼んでしまう -
#expect(...)
系メソッドをXCTestsから呼んでしまう
引き続きXCTestが有用になりそうなシーン
- UIオートメーション系API(
XCUIApplication
)を使いたい時 - パフォーマンステスト(
XCTMatric
)を使いたい時 -
Objective-C
しか使えないシーン
関連
Discussion