В чем отличие асинхронного подхода от синхронного
Что проверяют
Понимаете ли вы, как асинхронность в системе влияет на тесты: где ждать результат, как не получить нестабильные проверки и почему sleep это плохой ответ. Следом обычно просят рассказать, как тестировать операцию, которая завершается не сразу, например обработку через очередь.
Как отвечать
Синхронный вызов блокирует вызывающего до результата: отправили запрос, ждёте ответ, потом идёте дальше. Асинхронный возвращает управление сразу, а результат приходит позже: через колбэк, промис, событие или отдельный запрос статуса. Асинхронность не равна многопоточности: в JavaScript один поток и цикл событий, а операции при этом асинхронные.
Для QA важны места, где асинхронность видна снаружи:
- API с отложенной обработкой: сервер отвечает
202 Accepted, а работа идёт в фоне. Тест проверяет не ответ, а итоговое состояние, опрашивая статус с таймаутом; - очереди и события: Kafka, RabbitMQ. Между публикацией и эффектом проходит время, данные в базе появляются не сразу. Это согласованность в конечном счёте, eventual consistency;
- интерфейс: элементы появляются после загрузки данных. В Selenium нужны явные ожидания через
WebDriverWait, Playwright ждёт элементы сам; - вебхуки: ответ приходит по инициативе другой стороны, и порядок таких вызовов не гарантирован.
Правильный инструмент ожидания это условие плюс таймаут: явные ожидания в UI, Awaitility в Java, expect.poll в Playwright, цикл опроса в pytest. Фиксированная пауза либо тормозит прогон, либо падает на медленном стенде.
Синхронный подход проще отлаживать, и порядок в нём предсказуем. Асинхронный лучше держит нагрузку и долгие операции, но требует думать о порядке событий, повторах и частичных сбоях, а это прямой источник тест-кейсов.
Где спотыкаются
Ставят Thread.sleep(5000) или time.sleep там, где нужен опрос условия. Отсюда нестабильные тесты и медленный CI.
Путают асинхронность с параллельным запуском тестов. Параллельный прогон ускоряет набор тестов, а асинхронность это свойство тестируемой системы.
Забывают await в тестах на JavaScript или TypeScript. Проверка не дожидается промиса, и тест остаётся зелёным при сломанной функции.