🔎

Swift-Testingをキャッチアップする

2024/10/11に公開

Swift-Testingをキャッチアップ

Swift6のテストライブラリSwift-Testingについて基本的な概念をまとめました。

https://github.com/swiftlang/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との比較

XCTestXCTAssert系メソッドが40個以上存在していた

https://qiita.com/shirochan/items/10271912289dc563cc36

Swift Testingでは#expect#requireマクロの二つで表現できるようになった。テストに失敗したときの情報量も増える。

class以外のstructactorでテストスイートを定義できるようになったり、setUp()系メソッドがinit()に置き換わるなど、Swiftライクな書き心地になりました。

Not

以下の動作はサポートされていません。

  • XCTAssert...系メソッドをSwift Testingのテストから呼んでしまう
  • #expect(...)系メソッドをXCTestsから呼んでしまう

引き続きXCTestが有用になりそうなシーン

  • UIオートメーション系API(XCUIApplication)を使いたい時
  • パフォーマンステスト(XCTMatric)を使いたい時
  • Objective-Cしか使えないシーン

関連

https://www.youtube.com/watch?v=WFnkNcvLnCI
https://www.youtube.com/watch?v=bOvWGHi-BxI
https://github.com/swiftlang/swift-testing
https://zenn.dev/ojun_9/articles/66e785511dff2d
https://qiita.com/ykkd/items/67c1fc2f0dd1e85ca3c4

Discussion