Какие признаки успешных и хорошо написанных тестов в плане кода?
Что проверяют
Пишете ли вы автотесты как код, который годами поддерживает команда, или как набор записанных кликов. Следом обычно спрашивают, что вы делаете с нестабильными (flaky) тестами и как понимаете, что тест вообще что-то проверяет.
Как отвечать
Перечислите признаки с примерами из своего стека, будь то pytest, JUnit, Playwright или Selenium:
- один тест, одно поведение: структура Arrange, Act, Assert или Given, When, Then, имя описывает сценарий и ожидание, например
test_login_fails_with_expired_password. По имени упавшего теста понятно, что сломалось; - независимость: тест сам готовит данные и убирает за собой, не зависит от порядка запуска и от соседей. Тогда тесты можно гонять параллельно и перезапускать по одному;
- детерминированность: никаких
Thread.sleepиtime.sleep, только ожидание условия (WebDriverWaitв Selenium, автоожидания иexpectв Playwright). Время, случайность и внешние сервисы подменяются; - предусловия через API: данные создаются запросом или фабрикой, а не прокликиванием интерфейса, так тест быстрее и падает только на том, что проверяет;
- устойчивые локаторы:
data-testidили роли вместо XPath по вёрстке, плюс Page Object, чтобы смена вёрстки правилась в одном месте; - понятные падения: конкретные ассерты с сообщением, в отчёте скриншот, лог и запрос, причину видно без перезапуска;
- место в CI: основная масса проверок на уровне API и unit, UI-тестов меньше, прогон укладывается в разумное время на каждый merge request.
Отдельно скажите, как убеждаетесь, что тест ловит баги: ломаете код руками и смотрите, что тест покраснел, а на уровне unit используете мутационное тестирование (PIT, Stryker).
Где спотыкаются
Называют главным признаком стопроцентное покрытие. Покрытие показывает, какой код выполнился, а не что он проверен: тест без ассертов тоже его даёт.
Пишут логику в тестах: циклы, условия, пересчёт ожидаемого значения той же формулой, что в продакшен-коде. Такой тест повторяет ошибку, а не ловит её.
Лечат нестабильность повторами и увеличенными таймаутами. Автоматический перезапуск прячет гонку, которую надо найти и починить.