Testowanie kodu asynchronicznego (XCTest)
Pisz testy asynchroniczne za pomocą XCTest: oznaczaj testy jako async , używaj await i throws , testuj niepowodzenia oraz limity czasu i sprawdzaj wyniki współbieżności strukturalnej.
Testowanie kodu asynchronicznego (XCTest) to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 3 lekcji w sumie.
Testy async: podstawy
XCTest obsługuje testy async. Testy powinny być krótkie i deterministyczne:
- Należy deklarować testy
asynci używać await - Należy używać throws oraz
do/catchdo obsługi błędów - Należy zastępować funkcje sleep małymi atrapami/stubami
Przypadek pomyślnego testu async
Należy oznaczyć test jako async i wywołać SUT za pomocą await. Należy stosować zwykłe asercje, takie jak 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 i asercje
Należy używać testów async throws. W przypadku konkretnych błędów należy je przechwycić i dopasować wzorzec, aby jasno wyrazić intencję.
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)")
}
}
}Wyniki równoległe
Współbieżność strukturalna jest łatwa do testowania: należy użyć async let i sprawdzić końcowy wynik. Opóźnienia powinny być bardzo krótkie, aby uniknąć niestabilnych testów.
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
}
}Testowanie limitów czasu
Limity czasu należy testować, uruchamiając operację w wyścigu z krótkim zadaniem sleep. Należy używać bardzo małych wartości, aby testy były szybkie i stabilne.
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)")
}
}
}Oczekiwania (starszy kod)
W przypadku starszych wywołań zwrotnych nadal należy używać expectation/wait. W nowym kodzie należy preferować testy async.
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)
}
}Nowoczesny styl testów async
Szybkie sprawdzenie: Jaka jest najlepsza praktyka testowania funkcji async?
Podsumowanie
Podsumowanie: Należy używać metod XCTest oznaczonych jako async wraz z await, sprawdzać ścieżki sukcesu i błędów, utrzymywać bardzo krótkie opóźnienia, a oczekiwania rezerwować dla starszych wywołań zwrotnych.
Często zadawane pytania
Czy lekcja „Testowanie kodu asynchronicznego (XCTest)” jest bezpłatna?
Tak — pełny tekst „Testowanie kodu asynchronicznego (XCTest)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Testowanie kodu asynchronicznego (XCTest)”?
Pisz testy asynchroniczne za pomocą XCTest: oznaczaj testy jako async , używaj await i throws , testuj niepowodzenia oraz limity czasu i sprawdzaj wyniki współbieżności strukturalnej. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.
Ile czasu zajmuje lekcja „Testowanie kodu asynchronicznego (XCTest)”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Producent/konsument, potoki i limity czasu
- Łączenie starszych callbacków i Combine z async/await
- Testowanie kodu asynchronicznego (XCTest)