0Pricing
Swift Academy · レッスン

非同期テストとパフォーマンス計測

async/awaitで非同期関数をテストし、XCTMeasureOptionsで計測します。

「非同期テストとパフォーマンス計測」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

非同期関数のテスト

テストメソッドを async throws として宣言すると、余分な定型コードなしでテスト本体内から直接 await を使用できます。

final class FetcherTests: XCTestCase {
  func testFetchReturnsUser() async throws {
    let user = try await UserService().fetchUser(id: 1)
    XCTAssertEqual(user.name, "Alice")
  }
}

非同期の setUp と tearDown

setUp() async throws をオーバーライドして、各テストの前に非同期の初期化を実行します。

override func setUp() async throws {
  try await super.setUp()
  sut = await AsyncService.make()
}

コールバック API 用の XCTestExpectation

async/await ではなくコールバックを使用する API には、XCTestExpectation と wait(for:timeout:) を使用します。

func testCallback() {
  let exp = expectation(description: "data received")
  service.fetchWithCallback { data in
    XCTAssertNotNil(data)
    exp.fulfill()
  }
  wait(for: [exp], timeout: 5.0)
}

期待値の反転

反転した期待値は、期待値が満たされると失敗します。コールバックが呼び出されないことをアサートする場合に役立ちます。

let noCall = expectation(description: "should not fire")
noCall.isInverted = true
cancelledTask.onComplete { noCall.fulfill() }
wait(for: [noCall], timeout: 1.0)

パフォーマンス測定用の XCTMeasure

measure {} はブロックを 10 回実行し、平均時間、標準偏差、ベースラインとの比較を報告します。

func testSortPerformance() {
  let data = Array(0..<10_000).shuffled()
  measure {
    _ = data.sorted()
  }
}

XCTMeasureOptions

反復回数と測定する指標(時間、メモリ、CPU)を設定します。

func testParsePerformance() {
  let options = XCTMeasureOptions()
  options.iterationCount = 5
  measure(options: options) {
    _ = try? JSONDecoder().decode([Item].self, from: largeJSON)
  }
}

非同期処理のパフォーマンス測定

非同期処理を測定するには、非同期ブロックとともに measure(metrics:options:block:) を使用します。

func testAsyncFetchPerformance() {
  measure {
    let exp = expectation(description: "done")
    Task {
      _ = try? await service.fetchAll()
      exp.fulfill()
    }
    wait(for: [exp], timeout: 10)
  }
}

ベースライン

計測テストを実行した後、Xcode でベースラインを設定します。以降の実行では、パフォーマンスがしきい値を超えて低下すると失敗します。

// Xcode: click the grey icon next to the measure test
// → "Set Baseline" to record the current average
// Subsequent runs compare against the baseline

アクター分離されたコードのテスト

await を使用して、テストからアクター分離された状態にアクセスします。

actor Counter { var value = 0; func increment() { value += 1 } }
final class CounterTests: XCTestCase {
  func testIncrement() async {
    let counter = Counter()
    await counter.increment()
    let val = await counter.value
    XCTAssertEqual(val, 1)
  }
}

Swift Testing フレームワーク(Swift 6)

Swift 6 には、XCTest の最新の代替となる新しい Testing フレームワークが含まれています。@Test、#expect、@Suite を使用します。

import Testing

@Suite struct MathTests {
  @Test func addition() {
    #expect(2 + 2 == 4)
  }
}

XCTest と Swift Testing の併用

XCTest から Swift Testing へ移行する間、同じテストターゲット内で両方のフレームワークを共存させられます。

import XCTest
import Testing
// Legacy XCTestCase tests alongside @Test functions
// Both run when the test target is executed

確認問題

コードブロックのパフォーマンスを測定し、保存されたベースラインと比較する XCTest API はどれですか。

学習内容のまとめ

テストメソッドに async throws を付けると、await を直接使用できます。コールバックAPIには XCTestExpectation を使用します。measure {} で計測し、リグレッション検出用のベースラインを設定します。アクターは await を使ってテストします。最新のテストには、Swift Testingの @Test と #expect も活用できます。

よくある質問

「非同期テストとパフォーマンス計測」レッスンは無料ですか?

はい。「非同期テストとパフォーマンス計測」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「非同期テストとパフォーマンス計測」で何を学びますか?

async/awaitで非同期関数をテストし、XCTMeasureOptionsで計測します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「非同期テストとパフォーマンス計測」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. XCTestCaseのセットアップ、ティアダウン、テストメソッド
  2. XCTAssertファミリーとthrowingアサーション
  3. プロトコルベースのモックと依存性注入
  4. 非同期テストとパフォーマンス計測
← Swift Academyに戻る