Swift Academy · Lektion

Asynkrona tester och prestandamätning

Testa asynkrona funktioner med async/await och mät med XCTMeasureOptions.

Lektion 4 av 413 steg

Asynkrona tester och prestandamätning är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.

Testa asynkrona funktioner

Deklarera testmetoder som async throws för att använda await direkt i testmetoderna utan extra kod.

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

Asynkrona setUp och tearDown

Åsidosätt setUp() async throws för att utföra asynkron initiering före varje test.

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

XCTestExpectation för callback-API:er

För API:er som använder callback-funktioner i stället för async/await använder du XCTestExpectation och 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)
}

Invertera förväntningar

En inverterad förväntan misslyckas om den uppfylls – användbart när du vill kontrollera att en callback INTE anropas.

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

XCTMeasure för prestanda

measure {} kör sitt block 10 gånger och rapporterar genomsnittlig tid, standardavvikelse och jämförelse med en baslinje.

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

XCTMeasureOptions

Konfigurera antalet iterationer och vilket mått som ska mätas, till exempel tid, minne eller CPU.

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

Asynkron prestandamätning

Använd measure(metrics:options:block:) med ett asynkront block för att mäta asynkrona operationer.

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

Baslinjer

När du har kört ett mättest anger du en baslinje i Xcode. Framtida körningar misslyckas om prestandan försämras mer än tröskelvärdet.

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

Testa aktorisolerad kod

Åtkom aktorisolerat tillstånd från tester med 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)
  }
}

Ramverket Swift Testing (Swift 6)

Swift 6 levereras med det nya ramverket Testing, som innehåller @Test, #expect och @Suite som ett modernt alternativ till XCTest.

import Testing

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

Kombinera XCTest och Swift Testing

Båda ramverken kan samexistera i samma testmål under migreringen från XCTest till Swift Testing.

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

Snabb kontroll

Vilket XCTest-API mäter prestandan för ett kodblock och jämför den med en sparad baslinje?

Lektionssammanfattning

Markera testmetoder med async throws för att använda await direkt. Använd XCTestExpectation för callback-API:er. Mät med measure {} och ange baslinjer för att upptäcka regressioner. Testa actorer med await. Utforska @Test och #expect i Swift Testing för moderna tester.

Gratis att börja

Lär dig Swift med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
122
Lektioner
409

Vanliga frågor

Är lektionen ”Asynkrona tester och prestandamätning” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Asynkrona tester och prestandamätning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Asynkrona tester och prestandamätning”?

Testa asynkrona funktioner med async/await och mät med XCTMeasureOptions. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Swift Academy?

Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Asynkrona tester och prestandamätning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Swift Academy-lektionen?

Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. XCTestCase: konfiguration, nedmontering och testmetoder
  2. XCTAssert-familjen och assertions som kastar fel
  3. Protokollbaserad mocking och beroendeinjektion
  4. Asynkrona tester och prestandamätning
← Tillbaka till Swift Academy