0Pricing
Swift Academy · Lekcja

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 async i używać await
  • Należy używać throws oraz do/catch do 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

  1. Producent/konsument, potoki i limity czasu
  2. Łączenie starszych callbacków i Combine z async/await
  3. Testowanie kodu asynchronicznego (XCTest)
← Powrót do Swift Academy