Выбор ответа Senior Производительность и тестирование обновлено
Тестирование кода со временем
Вопрос
View model показывает подсказку через 5 секунд бездействия (try await Task.sleep(for: .seconds(5))). Как протестировать это быстро и стабильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Внедрить Clock и в тесте подставить часы, продвигая время вручную. С Swift 5.7 есть протокол Clock (ContinuousClock, SuspendingClock), и код может спать через clock.sleep(for:).
Варианты ответа
- Ждать в тесте 5 секунд с
XCTestExpectationи таймаутом 6 секунд - Внедрить
Clockи в тесте подставить часы, продвигая время вручнуюправильный ответ - Уменьшить задержку до 0 через
#if DEBUGпрямо в коде view model - Запускать такой тест только на CI, где время ожидания не мешает
Разбор
С Swift 5.7 есть протокол Clock (ContinuousClock, SuspendingClock), и код может спать через clock.sleep(for:). В тесте подставляют часы, время которых продвигается вручную, и тест проходит мгновенно и детерминированно. Реальное ожидание делает тесты медленными и нестабильными. #if DEBUG меняет поведение и не проверяет логику. Перенос на CI проблему не решает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Производительность и тестирование»
- Тест в Swift Testing
- Hang и hitch: разница
- Пирамида тестов в iOS
- Тестирование сетевого слоя через URLProtocol
- Бюджет кадра на iPhone с ProMotion
- Сколько памяти занимает декодированная картинка
- Приложение пропадает без крэш-лога
- Задача на Swift: статистика рывков по длительностям кадров