非同期コードのテスト(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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プロデューサー/コンシューマー、パイプライン、タイムアウト
- 従来のコールバック/Combineとasync/awaitの橋渡し
- 非同期コードのテスト(XCTest)