Асинхронные тесты и измерение производительности
Тестируйте асинхронные функции с async/await и измеряйте производительность с помощью XCTMeasureOptions.
«Асинхронные тесты и измерение производительности» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Настройка XCTestCase, очистка и методы тестирования
- Семейство XCTAssert и утверждения с выбрасыванием ошибок
- Имитация на основе протоколов и внедрение зависимостей
- Асинхронные тесты и измерение производительности