Swift Academy · Урок

Асинхронные тесты и измерение производительности

Тестируйте асинхронные функции с async/await и измеряйте производительность с помощью XCTMeasureOptions.

Урок 4 из 413 шагов

«Асинхронные тесты и измерение производительности» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Тестирование асинхронных функций

Объявляйте методы тестов как async throws, чтобы напрямую использовать await в теле теста без дополнительного шаблонного кода.

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

Асинхронные setUp и tearDown

Переопределите setUp() async throws, чтобы выполнять асинхронную инициализацию перед каждым тестом.

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

XCTestExpectation для API с обратными вызовами

Для API, использующих обратные вызовы вместо async/await, применяйте XCTestExpectation и 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)
}

Инвертирование ожиданий

Инвертированное ожидание завершается ошибкой, если оно IS выполнено — это удобно для проверки, что обратный вызов NOT вызывается.

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

XCTMeasure для измерения производительности

measure {} выполняет свой блок 10 раз и сообщает среднее время, стандартное отклонение и сравнение с базовым показателем.

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

XCTMeasureOptions

Настройте количество итераций и измеряемую метрику (время, память или CPU).

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

Асинхронное измерение производительности

Используйте measure(metrics:options:block:) с асинхронным блоком для измерения асинхронных операций.

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

Базовые показатели

После выполнения теста измерения задайте базовый показатель в Xcode. Будущие запуски завершатся ошибкой, если производительность ухудшится сильнее допустимого порога.

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

Тестирование кода, изолированного актором

Получайте доступ к состоянию, изолированному актором, из тестов с помощью 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)
  }
}

Фреймворк Swift Testing (Swift 6)

Swift 6 поставляется с новым фреймворком Testing, в котором есть @Test, #expect и @Suite; это современная альтернатива XCTest.

import Testing

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

Сочетание XCTest и Swift Testing

Оба фреймворка могут сосуществовать в одной цели тестирования во время перехода с XCTest на Swift Testing.

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

Быстрая проверка

Какой API XCTest измеряет производительность блока кода и сравнивает её с сохранённым базовым показателем?

Итоги урока

Помечайте методы тестирования как async throws, чтобы напрямую использовать await. Для API обратных вызовов используйте XCTestExpectation. Измеряйте производительность с помощью measure {} и задавайте базовые показатели для обнаружения регрессий. Тестируйте акторы с помощью await. Изучите средства тестирования Swift: @Test и #expect для современного тестирования.

Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Асинхронные тесты и измерение производительности» бесплатный?

Да — полный текст урока «Асинхронные тесты и измерение производительности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Асинхронные тесты и измерение производительности»?

Тестируйте асинхронные функции с async/await и измеряйте производительность с помощью XCTMeasureOptions. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Асинхронные тесты и измерение производительности»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка XCTestCase, очистка и методы тестирования
  2. Семейство XCTAssert и утверждения с выбрасыванием ошибок
  3. Имитация на основе протоколов и внедрение зависимостей
  4. Асинхронные тесты и измерение производительности
← Назад к Swift Academy