Asynchronen Code testen (XCTest)
Schreiben Sie async tests mit XCTest: Kennzeichnen Sie Tests als async , verwenden Sie await und throws , testen Sie Fehler und Timeouts und prüfen Sie die Ergebnisse strukturierter Nebenläufigkeit.
Asynchronen Code testen (XCTest) ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Async-Tests: Grundlagen
XCTest unterstützt async-Tests. Halten Sie Tests klein und deterministisch:
- Deklarieren Sie
async-Tests und verwenden Sie await - Verwenden Sie throws und
do/catchfür Fehler - Ersetzen Sie Sleeps durch kleine Fakes/Stubs
Erfolgsfall eines Async-Tests
Kennzeichnen Sie den Test als async und rufen Sie das SUT mit await auf. Schreiben Sie normale Assertions wie 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 und Assertions
Verwenden Sie Tests mit async throws. Bei bestimmten Fehlern fangen Sie diese ab und führen einen Pattern-Match durch, damit die Absicht klar bleibt.
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)")
}
}
}Parallele Ergebnisse
Strukturierte Nebenläufigkeit lässt sich einfach testen: Verwenden Sie async let und prüfen Sie das Endergebnis. Halten Sie Verzögerungen sehr kurz, um instabile Tests zu vermeiden.
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
}
}Timeouts testen
Testen Sie Timeouts, indem Sie die Operation gegen einen kurzen sleep-Aufruf antreten lassen. Verwenden Sie sehr kurze Zeitspannen, damit die Tests schnell und stabil bleiben.
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)")
}
}
}Expectations (Legacy)
Für ältere Callbacks verwenden Sie weiterhin expectation/wait. Bevorzugen Sie für neuen Code Async-Tests.
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)
}
}Moderner Stil für Async-Tests
Kurzprüfung: Was ist die beste Vorgehensweise, um eine asynchrone Funktion zu testen?
Zusammenfassung
Zusammenfassung: Verwenden Sie async-XCTest-Methoden mit await, prüfen Sie Erfolgs- und Fehlerpfade, halten Sie Verzögerungen sehr kurz und verwenden Sie Expectations nur für Legacy-Callbacks.
Häufig gestellte Fragen
Ist die Lektion „Asynchronen Code testen (XCTest)“ kostenlos?
Ja — der vollständige Text von „Asynchronen Code testen (XCTest)“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Asynchronen Code testen (XCTest)“?
Schreiben Sie async tests mit XCTest: Kennzeichnen Sie Tests als async , verwenden Sie await und throws , testen Sie Fehler und Timeouts und prüfen Sie die Ergebnisse strukturierter Nebenläufigkeit. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 3.
Wie lange dauert die Lektion „Asynchronen Code testen (XCTest)“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Producer/Consumer, Pipelines und Timeouts
- Legacy-Callbacks/Combine mit async/await verbinden
- Asynchronen Code testen (XCTest)