0Pricing
Swift Academy · レッスン

非同期コードのテスト(XCTest)

XCTestで 非同期テスト を書きます。テストを async として宣言し、 await と throws を使い、失敗やタイムアウトをテストして、構造化並行性の結果をアサートします。

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

非同期テストの基本

XCTestはasyncテストをサポートしています。テストは小さく、決定性のあるものにしてください:

  • asyncテストを宣言し、awaitを使用します
  • 失敗にはthrowsとdo/catchを使います
  • sleepを小さなフェイク/スタブに置き換えます

非同期の成功ケース

テストにasyncを付け、awaitでSUTを呼び出します。XCTAssertEqualのような通常のアサーションを記述してください。

import XCTest
import Foundation

// System Under Test (SUT)
func fetchValue() async -> Int {
    try? await Task.sleep(nanoseconds: 50_000_000)
    return 42
}

final class AsyncBasicsTests: XCTestCase {
    func testFetchValue_returns42() async {
        let v = await fetchValue()
        XCTAssertEqual(v, 42)
    }
}

async throwsとアサーション

async throwsテストを使います。特定のエラーについては、catchしてパターンマッチングを行うと、意図を明確に保てます。

import XCTest

enum NetError: Error { case offline }

func loadNumber(online: Bool) async throws -> Int {
    try await Task.sleep(nanoseconds: 30_000_000)
    if !online { throw NetError.offline }
    return 7
}

final class AsyncThrowingTests: XCTestCase {
    func testLoadNumber_success() async throws {
        let n = try await loadNumber(online: true)
        XCTAssertEqual(n, 7)
    }

    func testLoadNumber_offline_throws() async {
        do {
            _ = try await loadNumber(online: false)
            XCTFail("Expected error")
        } catch NetError.offline {
            // expected
        } catch {
            XCTFail("Unexpected error: \\(error)")
        }
    }
}

並列結果

構造化並行性は簡単にテストできます。async letを使い、最終結果をアサートしてください。テストが不安定にならないよう、遅延は短く保ちます。

import XCTest

func compute(_ x: Int) async -> Int {
    try? await Task.sleep(nanoseconds: 10_000_000)
    return x * x
}

final class ParallelTests: XCTestCase {
    func testParallel_asyncLet_sumsSquares() async {
        async let a = compute(2)
        async let b = compute(3)
        let sum = await (a + b)
        XCTAssertEqual(sum, 13) // 4 + 9
    }
}

タイムアウトのテスト

タイムアウトは、操作と短いsleepを競合させてテストします。テストを高速で安定したものにするため、非常に短い時間を使ってください。

import XCTest

enum TimeoutError: Error { case timedOut }

func withTimeout<T>(
    seconds: Double,
    operation: @escaping () async throws -> T
) async throws -> T {
    try await withThrowingTaskGroup(of: T.self) { group in
        group.addTask { try await operation() }
        group.addTask {
            try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
            throw TimeoutError.timedOut
        }
        let first = try await group.next()!
        group.cancelAll()
        return first
    }
}

final class TimeoutTests: XCTestCase {
    func testTimeout_timesOutFast() async {
        do {
            _ = try await withTimeout(seconds: 0.01) {
                try await Task.sleep(nanoseconds: 50_000_000) // slower than timeout
                return "OK"
            }
            XCTFail("Expected timeout")
        } catch TimeoutError.timedOut {
            // expected
        } catch {
            XCTFail("Unexpected error: \\(error)")
        }
    }
}

Expectation(レガシー)

古いコールバックには、引き続きexpectation/waitを使います。新しいコードでは非同期テストを優先してください。

import XCTest

// Legacy API with a completion handler
func legacyFetch(_ completion: @escaping (String) -> Void) {
    Task { try? await Task.sleep(nanoseconds: 20_000_000); completion("done") }
}

final class ExpectationTests: XCTestCase {
    func testLegacy_withExpectation() {
        let exp = expectation(description: "legacy finishes")
        legacyFetch { value in
            XCTAssertEqual(value, "done")
            exp.fulfill()
        }
        wait(for: [exp], timeout: 1.0)
    }
}

現代的な非同期テストスタイル

確認問題:非同期関数をテストするベストプラクティスは何ですか?

まとめ

まとめ:awaitを使うasync XCTestメソッドでテストし、成功と失敗の経路をアサートします。遅延は短く保ち、expectationはレガシーコールバック用に限定してください。

よくある質問

「非同期コードのテスト(XCTest)」レッスンは無料ですか?

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

「非同期コードのテスト(XCTest)」で何を学びますか?

XCTestで 非同期テスト を書きます。テストを async として宣言し、 await と throws を使い、失敗やタイムアウトをテストして、構造化並行性の結果をアサートします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「非同期コードのテスト(XCTest)」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. プロデューサー/コンシューマー、パイプライン、タイムアウト
  2. 従来のコールバック/Combineとasync/awaitの橋渡し
  3. 非同期コードのテスト(XCTest)
← Swift Academyに戻る