Swift Academy · Lekcja

Testy asynchroniczne i pomiar wydajności

Testowanie funkcji asynchronicznych za pomocą async/await i pomiar z użyciem XCTMeasureOptions.

Lekcja 4 z 413 kroki

Testy asynchroniczne i pomiar wydajności to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. 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 4 lekcji w sumie.

Testowanie funkcji asynchronicznych

Deklaruj metody testowe jako async throws, aby bezpośrednio używać await w ciałach testów bez dodatkowego kodu pomocniczego.

final class FetcherTests: XCTestCase {
  func testFetchReturnsUser() async throws {
    let user = try await UserService().fetchUser(id: 1)
    XCTAssertEqual(user.name, "Alice")
  }
}

Asynchroniczne setUp i tearDown

Nadpisz setUp() async throws, aby wykonać asynchroniczną inicjalizację przed każdym testem.

override func setUp() async throws {
  try await super.setUp()
  sut = await AsyncService.make()
}

XCTestExpectation dla API opartych na wywołaniach zwrotnych

W przypadku API używających wywołań zwrotnych zamiast async/await użyj XCTestExpectation oraz wait(for:timeout:).

func testCallback() {
  let exp = expectation(description: "data received")
  service.fetchWithCallback { data in
    XCTAssertNotNil(data)
    exp.fulfill()
  }
  wait(for: [exp], timeout: 5.0)
}

Odwracanie oczekiwań

Odwrócone oczekiwanie powoduje niepowodzenie testu, jeśli ZOSTANIE spełnione — przydaje się do sprawdzania, czy wywołanie zwrotne NIE nastąpi.

let noCall = expectation(description: "should not fire")
noCall.isInverted = true
cancelledTask.onComplete { noCall.fulfill() }
wait(for: [noCall], timeout: 1.0)

XCTMeasure do pomiaru wydajności

measure {} wykonuje swój blok 10 razy i zgłasza średni czas, odchylenie standardowe oraz porównanie z wartością bazową.

func testSortPerformance() {
  let data = Array(0..<10_000).shuffled()
  measure {
    _ = data.sorted()
  }
}

XCTMeasureOptions

Skonfiguruj liczbę iteracji oraz mierzoną metrykę, taką jak czas, pamięć lub użycie procesora.

func testParsePerformance() {
  let options = XCTMeasureOptions()
  options.iterationCount = 5
  measure(options: options) {
    _ = try? JSONDecoder().decode([Item].self, from: largeJSON)
  }
}

Asynchroniczny pomiar wydajności

Użyj measure(metrics:options:block:) z asynchronicznym blokiem, aby mierzyć operacje asynchroniczne.

func testAsyncFetchPerformance() {
  measure {
    let exp = expectation(description: "done")
    Task {
      _ = try? await service.fetchAll()
      exp.fulfill()
    }
    wait(for: [exp], timeout: 10)
  }
}

Wartości bazowe

Po uruchomieniu testu pomiarowego ustaw wartość bazową w Xcode. Kolejne uruchomienia zakończą się niepowodzeniem, jeśli wydajność pogorszy się ponad określony próg.

// Xcode: click the grey icon next to the measure test
// → "Set Baseline" to record the current average
// Subsequent runs compare against the baseline

Testowanie kodu izolowanego przez aktora

Uzyskuj dostęp do stanu izolowanego przez aktora z testów za pomocą await.

actor Counter { var value = 0; func increment() { value += 1 } }
final class CounterTests: XCTestCase {
  func testIncrement() async {
    let counter = Counter()
    await counter.increment()
    let val = await counter.value
    XCTAssertEqual(val, 1)
  }
}

Framework Swift Testing (Swift 6)

Swift 6 zawiera nowy framework Testing z elementami @Test, #expect i @Suite, stanowiący nowoczesną alternatywę dla XCTest.

import Testing

@Suite struct MathTests {
  @Test func addition() {
    #expect(2 + 2 == 4)
  }
}

Łączenie XCTest i Swift Testing

Oba frameworki mogą współistnieć w tym samym celu testowym podczas migracji z XCTest do Swift Testing.

import XCTest
import Testing
// Legacy XCTestCase tests alongside @Test functions
// Both run when the test target is executed

Szybkie sprawdzenie

Które API XCTest mierzy wydajność bloku kodu i porównuje ją z zapisaną wartością bazową?

Podsumowanie lekcji

Metody testowe należy oznaczać jako async throws, aby bezpośrednio używać await. W przypadku interfejsów API opartych na callbackach należy używać XCTestExpectation. Pomiary należy wykonywać za pomocą measure {} i ustawiać wartości bazowe w celu wykrywania regresji. Aktorów należy testować z użyciem await. W nowoczesnych testach warto poznać @Test i #expect z Swift Testing.

Bezpłatny start

Ucz się Swift dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
122
Lekcje
409

Często zadawane pytania

Czy lekcja „Testy asynchroniczne i pomiar wydajności” jest bezpłatna?

Tak — pełny tekst „Testy asynchroniczne i pomiar wydajności” 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 4 lekcji w sumie.

Co nauczysz się w „Testy asynchroniczne i pomiar wydajności”?

Testowanie funkcji asynchronicznych za pomocą async/await i pomiar z użyciem XCTMeasureOptions. Ć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 4 z 4.

Ile czasu zajmuje lekcja „Testy asynchroniczne i pomiar wydajności”?

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. Konfiguracja XCTestCase, sprzątanie i metody testowe
  2. Rodzina XCTAssert i asercje zgłaszające błędy
  3. Mockowanie oparte na protokołach i wstrzykiwanie zależności
  4. Testy asynchroniczne i pomiar wydajności
← Powrót do Swift Academy