Page Object — это слой, где хранятся локаторы и действия со страницей, а не бизнес-логика теста.
Так тесты остаются читаемыми: сценарий описывает поведение пользователя, а технические детали скрыты в page-классе.
Из практики: при изменении интерфейса обычно правим один Page Object, а не десятки тестов.
Частые ошибки
Складывают всю бизнес-логику прямо в page-классы.
Дополнительные вопросы
Какой слой держит assert-ы: page или test?
Как бороться с флаки?
Middle
Сначала нахожу корень нестабильности: жёсткие паузы (sleep), недетерминированные данные, зависимость между тестами, внешние сервисы без стабов, гонки в ожиданиях элементов.
Убираю sleep, перехожу на явные ожидания условий; изолирую тестовые данные — каждый тест создаёт свои; нестабильные внешние зависимости заменяю на стабы или моки.
Из практики: флаки-тест без диагностики — это технический долг. Завожу задачу и устраняю причину, а не добавляю retry как заплатку.
Частые ошибки
Лечат флаки только retry без устранения причины.
Дополнительные вопросы
Какие метрики используешь для флаки?
Что такое flaky-тесты?
Middle
Нестабильные тесты — это тесты, которые то проходят, то падают без изменений в коде.
Обычно причина в ожиданиях, данных, окружении или скрытой зависимости между тестами.
Из практики: пока не уберёшь корень проблемы, простые перезапуски только маскируют риск.
Частые ошибки
Игнорируют периодические падения тестов (re-run до зелёного), что маскирует реальные проблемы и снижает эффективность CI.
Ищут проблему только в тесте, хотя зачастую нестабильные поведение вызвано дефектом системы (например, гонки в коде) – важно рассмотреть и продукт, и тест.
Дополнительные вопросы
Как поступить с нестабильные-тестами: исправлять, помечать особым образом или изолировать?
Можете привести пример причины нестабильные-теста и как её устранили?
Как организовать структуру проекта?
Middle
Разделяю проект на слои: тесты (сценарии), page objects / API-клиенты (взаимодействие), утилиты (хелперы), данные (фикстуры, фабрики), конфигурация (окружения, настройки запуска).
Добавляю единый стиль именования (test_*, Page, Client-суффиксы), понятный entrypoint запуска через pytest/maven, и README с инструкцией для нового участника.
Из практики: главный признак хорошей структуры — новый разработчик понимает, куда добавить тест и где лежат локаторы, без объяснений.
Частые ошибки
Смешивают тесты, инфраструктуру и бизнес-логику в одной папке.
Дополнительные вопросы
Какие папки считаешь обязательными?
Как хранить тест-данные?
Middle
Храню данные так, чтобы они были читаемыми и версионируемыми: статические данные (expected responses, config) — в JSON/YAML-файлах рядом с тестами; динамические — через фабрики в setUp/fixture.
Критично отделять статические данные от динамически создаваемых в рантайме — первые версионируются в git, вторые создаются и удаляются каждым тестом.
Из практики: статические данные в JSON позволяют версионировать ожидаемые ответы вместе с кодом теста. Изменение ответа API сразу видно в git diff — это ускоряет code review.
Частые ошибки
Жёстко вшивают данные в тесты.
Дополнительные вопросы
Как решаешь конфликты данных в параллельных прогонах?
Почему тесты падают только в CI?
Middle
Сравниваю локальное и CI-окружение по ключевым параметрам: версии Python/Java/браузера, переменные окружения, доступность зависимостей, порядок запуска тестов.
Проверяю гонки и зависимости между тестами, которые не видны при локальном одиночном запуске; смотрю права доступа к файлам и тайминги (CI часто медленнее).
Из практики: чаще всего причина — разные версии зависимостей или тест, который портит общие данные и маскирует это при локальном запуске. Фиксируется через requirements.txt/lock-файл и изоляцию данных.
Частые ошибки
Не сохраняют артефакты падения в CI.
Дополнительные вопросы
Что первым делом сравнишь между локалью и CI?
Как вы применяете Page Object Model в Java-автоматизации?
Middle
Шаблон Page Object помогает отделить сценарии тестов от деталей интерфейса.
Локаторы и действия лежат в одном месте, а сами тесты остаются читаемыми и ближе к бизнес-логике.
Из практики: при изменениях интерфейса это сильно экономит время поддержки.
Частые ошибки
Слишком много логики в Page Objects.
Нарушение принципа single responsibility.
Дополнительные вопросы
Как организуете page components?
Используете Page Factory или plain locators?
Как вы применяете Builder Pattern для тестовых данных?
Middle
«Строитель» удобен, когда тестовые данные сложные и имеют много полей.
Он делает подготовку данных читаемой и уменьшает копипасту в тестах.
Из практики: через строители проще поддерживать тесты при изменении модели данных.
Частые ошибки
Забывание validation в build() методе.
Переиспользование builder без reset состояния.
Дополнительные вопросы
Как валидируете обязательные поля в Builder?
Опыт с Telescoping Constructor problem?
Как вы применяете Factory Pattern в автотестах: webdriver и page factories?
Middle
WebDriver-фабрика: единая точка создания драйвера — по параметру (Chrome/Firefox/remote) возвращаю сконфигурированный экземпляр, пряча детали capabilities и Selenium Grid.
Page Factory: поля-элементы Page Object с @FindBy инициализирую через PageFactory.initElements — это ленивый поиск и меньше шаблонного кода.
Так и подготовка окружения, и создание объектов централизованы в одном месте: сменить браузер или локатор проще, дублирования меньше.
Из практики: такой подход уменьшает дублирование и упрощает поддержку.
Частые ошибки
Хардкод browser типов вместо enum/constants.
Отсутствие cleanup созданных drivers.
Дополнительные вопросы
Как управляете lifecycle драйверов?
Используете Abstract Factory для сложных иерархий?
Когда Singleton Pattern уместен для общих ресурсов в тестах?
Middle
Одиночка подходит для общего ресурса, который должен существовать в одном экземпляре.
В тестах применяю его осторожно, чтобы не получить скрытую зависимость между тестами.
Из практики: общий глобальный объект часто становится источником нестабильности при параллельном запуске.
Частые ошибки
Thread safety issues в parallel тестах.
Сложность unit тестирования Singleton классов.
Дополнительные вопросы
Как тестируете Singleton классы?
Альтернативы Singleton в dependency injection?
Как вы используете Strategy Pattern для разных стратегий запуска тестов?
Middle
«Стратегия» позволяет переключать алгоритм выполнения без переписывания остального кода.
Для тестов это удобно, когда нужно запускать один сценарий разными способами.
Из практики: с этим шаблоном легче расширять проект без ломки старого кода.
Частые ошибки
Overengineering простых случаев.
Отсутствие fallback стратегий.
Дополнительные вопросы
Когда предпочитаете Strategy vs простые if-else?
Опыт с Command Pattern в тестах?
Как вы применяете service virtualization и test doubles в микросервисах?
Middle
Test doubles различаю по типам: dummy, stub, spy, mock и fake — выбираю по тому, что проверяю: состояние или взаимодействие.
Для service virtualization поднимаю двойники внешних сервисов инструментами вроде WireMock, Mountebank или Hoverfly, когда реальная зависимость недоступна или нестабильна.
Держу поведение двойника близким к реальному контракту (схемы, коды ошибок, задержки), подкрепляя contract-тестами.
Из практики: если двойник сильно отличается от продовой логики, тесты дают ложную уверенность.
Частые ошибки
Mocks дрейфуют от реальных сервисов.
Over-mocking скрывает интеграция issues.
Дополнительные вопросы
Предпочитаете mocks или real services?
Как синхронизируете mocks с API changes?
Как Observer Pattern помогает в тестовой отчётности и обработке событий?
Senior
«Наблюдатель» удобен, когда несколько компонентов должны реагировать на одно событие.
В тестах это помогает проверять, что все подписчики получили и обработали событие правильно.
Из практики: чаще всего проблемы здесь связаны с порядком уведомлений и дублированием обработки.
Частые ошибки
Memory leaks из-за неотписанных observers.
Performance impact от множественных notifications.
Дополнительные вопросы
Как интегрируете с CI/CD reporting?
Опыт с Event-driven test architectures?
Как организовать тестовых процессов в масштабе?
Senior
Тестовая пирамида в масштабе: ~70% юнит-тесты (быстрые, дешёвые), ~20% интеграционные (проверяют взаимодействие компонентов), ~10% E2E (сквозные бизнес-сценарии). Перевернутая пирамида — сигнал проблем со скоростью и стабильностью.
При масштабировании важны: параллельный запуск (pytest-xdist, TestNG parallel), изоляция данных через уникальные ключи или транзакции, централизованное хранение конфигураций, прозрачная отчётность.
Из практики: масштабирование тестов без изоляции данных приводит к каскадным падениям при параллельном запуске. Сначала решаю изоляцию, потом увеличиваю параллелизм.
Частые ошибки
Нарушение пропорций тестовой пирамиды.
Отсутствие стратегии распараллеливания.
Недостаточная документация процессов.
Дополнительные вопросы
Как определяете оптимальное соотношение типов тестов?
Стратегии борьбы с нестабильные тестами?
Как выстроить управление тестовыми данными?
Senior
Стратегии создания тестовых данных: фабрики/билдеры для программного создания объектов; файловые фикстуры (JSON/YAML) для статичных наборов; синтетическая генерация через faker для реалистичных данных.
Управление состоянием: изоляция через транзакции с откатом; создание данных через API перед тестом и удаление после; уникальные ключи (UUID) для предотвращения коллизий при параллельном запуске.
Из практики: самая надёжная стратегия — каждый тест создаёт свои данные и удаляет их в teardown. Это медленнее, но даёт полную изоляцию и воспроизводимость.
Частые ошибки
Использование продовых данных без маскирования.
Отсутствие стратегии очистки данных.
Конфликты при параллельном выполнении.
Дополнительные вопросы
Как организуете данные subset selection?
Стратегии масштабирования тестовых данных?
Как вы стабилизируете автоматизированные тесты?
Senior
Стабилизация автопроверок начинается с поиска причины, а не с бесконечных перезапусков.
Я убираю жёсткие паузы, нормализую данные и выравниваю окружение.
Из практики: регулярный разбор нестабильных тестов быстро повышает доверие к регрессии.
Частые ошибки
Игнорирование нестабильные тестов.
Отсутствие мониторинга стабильности.
Неправильная обработка таймаутов.
Дополнительные вопросы
Как определяете, что тест нестабильные?
Процесс исследования нестабильности?
Как вы выстраиваете code review практики в автоматизации тестирования?
Senior
Критерии проверки кода тестов: тест проверяет одну вещь и имеет понятное имя; нет жёстких пауз (sleep); данные изолированы; assertions информативны; нет дублирования (вынесено в фикстуры и хелперы).
Автоматизация проверок: линтеры (flake8/pylint для Python, checkstyle для Java) контролируют стиль кода; pre-commit хуки блокируют плохой код до пуша; статический анализ запускается в CI при каждом PR.
Из практики: ревью тестового кода важно так же, как ревью продуктового. Плохой тест, который всегда зелёный, создаёт ложную уверенность — проверяю, что тест реально может упасть при наличии дефекта.
Частые ошибки
Формальный подход к ревью.
Игнорирование автоматических проверок.
Отсутствие follow-up по комментариям.
Дополнительные вопросы
Как организуете code review в распределенной команде?
Стратегии обучения через code review?
Как выстроить управление техническим долгом в автоматизации?
Senior
Технический долг в автоматизации надо вести как обычный рабочий бэклог с приоритетами и сроками.
Я выделяю время на рефакторинг и удаление хрупких участков, иначе долг быстро съедает скорость команды.
Из практики: регулярная работа с долгом делает регрессию предсказуемой и дешевле в поддержке.
Частые ошибки
Откладывание рефакторинга.
Отсутствие метрик долга.
Неправильная приоритизация.
Дополнительные вопросы
Как оцениваете ROI рефакторинга?
Стратегии убеждения команды?
Какие Test Design Patterns и архитектурные решения вы используете в автотестах?
Senior
Паттерны в тест-дизайне нужны, чтобы решения по проверкам были воспроизводимыми и масштабировались вместе с продуктом.
Я выбираю паттерн под тип риска: данные, состояние, интеграции, отказы, а не «по учебнику».
Из практики: когда архитектурные решения в тестах единообразны, команда быстрее вносит изменения и реже ломает регрессию.
Частые ошибки
Overengineering решений.
Нарушение принципов SOLID.
Сложная поддержка абстракций.
Дополнительные вопросы
Когда Page Object не подходит?
Опыт с другими архитектурными паттернами?
Как делать профилирование и оптимизация тестов?
Senior
Профилирование тестов начинаю с `pytest --durations=10` — показывает 10 самых медленных тестов. Для детального анализа использую cProfile или py-spy (для Python), JProfiler или JFR (Java Flight Recorder) для Java.
Оптимизирую самые дорогие участки: заменяю setup через UI на setup через API (в 10–20 раз быстрее), выношу общие ресурсы в session-scope фикстуры, параллелизую независимые тесты.
Из практики: точечная оптимизация самых медленных 10% тестов обычно даёт 30–50% выигрыша по общему времени прогона. Оптимизировать всё подряд без измерений — пустая трата времени.
Частые ошибки
Преждевременная оптимизация.
Неправильные метрики.
Локальная вместо системной оптимизации.
Дополнительные вопросы
Как определяете bottlenecks?
Стратегии масштабирования ресурсов?
Как вы отлаживаете автоматизированные тесты?
Middle
При отладке автопроверок я сначала воспроизвожу падение и собираю минимальный набор фактов: шаг, данные, окружение, журнал.
Потом сужаю причину и фиксирую решение так, чтобы подобный дефект не повторился.
Из практики: системный разбор быстрее даёт результат, чем хаотичные перезапуски.
Частые ошибки
Избыточное логирование.
Неправильные уровни логов.
Отсутствие контекста в логах.
Дополнительные вопросы
Как отлаживаете асинхронные тесты?
Стратегии отладки в CI/CD?
Как выстроить архитектуру автоматических проверок, чтобы их было легко поддерживать?
Middle
Я разделяю проект на слои: тесты (сценарии), page objects / API-клиенты (взаимодействие), фабрики данных, утилиты и конфигурация. Изменения в одном слое не должны тянуться по всему проекту.
Отдельно закрепляю единые правила именования, журналирования и обработки ошибок — они должны быть одинаковы во всём проекте.
Из практики: главный признак хорошей архитектуры — добавление нового теста занимает минуты и требует правок в одном-двух файлах, а не пяти. Если иначе — рефакторинг нужен сейчас.
Частые ошибки
Смешивают бизнес-сценарии и технические детали в одном месте.
Дополнительные вопросы
Какие слои считаешь обязательными?
Как уменьшить количество ложных падений автоматических проверок?
Middle
Сначала ищу корень нестабильности: жёсткие паузы (sleep), общие тестовые данные, зависимость между тестами, нестабильные внешние сервисы, проблемы с таймингами в CI.
Убираю sleep и перехожу на явные ожидания условий; каждый тест обеспечиваю независимыми данными; нестабильные зависимости изолирую стабами.
Из практики: ложные падения — это технический долг. Я завожу задачу на каждое, а не добавляю retry — иначе реальные дефекты начинают прятаться за ретраями.
Частые ошибки
Лечат нестабильность только повторным запуском.
Дополнительные вопросы
Какие причины нестабильности встречаешь чаще всего?
Как проектировать моки и стабы для изоляции тестов?
Middle
Использую моки и стабы там, где внешняя зависимость нестабильна, дорогая или недоступна в тестовом окружении. Мок проверяет взаимодействие (был ли вызван метод), стаб возвращает фиксированный ответ.
Проверяю, что поведение заглушки близко к реальному договору API — иначе тесты зелёные, а продакшн падает.
Из практики: перед написанием мока сверяюсь с реальным контрактом. Когда реальный сервис изменился, а мок нет — это источник ложной уверенности. Contract-тесты помогают поддерживать синхронизацию.
Частые ошибки
Заглушки расходятся с реальным договором сервиса.
Дополнительные вопросы
Когда лучше использовать мок, а когда стаб?
Как выбрать уровень автоматизации для нового сценария?
Middle
Смотрю на три критерия: риск сценария (насколько критичен для бизнеса), стоимость поддержки (насколько стабилен UI/API) и скорость обратной связи (unit < API < UI).
Критичные и стабильные проверки стараюсь держать ближе к низким уровням — unit и API. UI-тесты только для ключевых пользовательских потоков, которые нельзя покрыть иначе.
Из практики: если бизнес-логику можно проверить на уровне unit или API — не несу её в UI-тест. UI-тесты в 5–10 раз медленнее и нестабильнее, поэтому используются точечно.
Частые ошибки
Автоматизируют всё только через интерфейс.
Дополнительные вопросы
Какие критерии используешь для выбора уровня?
Как организовать журналирование в автопроверках?
Middle
Журнал должен показывать шаги выполнения, данные запроса и ответа, понятную причину падения — без лишнего шума, чтобы по логу можно было восстановить сценарий.
Добавляю вложения для упавших тестов: снимок экрана, тело ответа API, HTML-страницу, SQL-запрос — всё, что сокращает время диагностики при разборе.
Из практики: хороший журнал устраняет необходимость воспроизводить падение вручную в большинстве случаев — это экономит часы при большом наборе тестов.
Частые ошибки
Пишут слишком много лишней информации и теряют главное.
Дополнительные вопросы
Какие поля в журнале считаешь обязательными?
Как делать автоматические проверки независимыми друг от друга?
Middle
Каждая проверка должна сама готовить свои данные и не зависеть от порядка запуска — ни от предыдущих тестов, ни от глобального состояния.
После выполнения очищаю созданные данные или использую транзакции с откатом, чтобы следующий тест начинал с чистого состояния.
Из практики: тест, зависящий от предыдущего, в 70% случаев становится источником каскадных падений. Один упал — все следующие красные, хотя сами по себе рабочие.
Частые ошибки
Тесты зависят от общих данных и порядка выполнения.
Дополнительные вопросы
Как проверишь, что тест действительно независим?
Почему автопроверки проходят локально, но падают в непрерывной сборке?
Middle
Сравниваю версии зависимостей, переменные окружения, доступность ресурсов и порядок запуска между локальной и CI-средой.
Проверяю тайминги, права доступа к файлам и состояние тестовых данных в общей среде — в CI часто медленнее и строже по правам.
Из практики: самая частая причина — разные версии зависимостей. Фиксирую все версии в requirements.txt с точными версиями (`==`), а не через диапазоны (`>=`). Lock-файлы (poetry.lock, package-lock.json) решают это системно.
Частые ошибки
Не сохраняют артефакты падения из сборки.
Дополнительные вопросы
Что проверишь в первую очередь при таком падении?
Как выбирать стратегию повторного запуска упавших автопроверок?
Middle
Повторный запуск использую как временную меру только для нестабильных внешних факторов — сеть, внешние API, ненадёжное тестовое окружение.
Количество повторов ограничиваю (обычно 2–3) и параллельно создаю задачу на устранение корневой причины. Retry без диагностики — это технический долг в рассрочку.
Из практики: если retry нужен — это сигнал проблемы, а не решение. Скрытые за retry падения маскируют реальные дефекты и снижают доверие к регрессии.
Частые ошибки
Оставляют повторы навсегда без исправления причины.
Дополнительные вопросы
Какой предел повторов считаешь разумным?
Как поддерживать качество кода в проекте автоматизации?
Middle
Держу единые правила через линтер: стиль кода, именование тестов и переменных, запрет на sleep, обязательный teardown, максимальная длина метода.
Регулярно разбираю технический долг: нахожу дублирование, хрупкие участки, устаревшие тесты — и выделяю время в бэклоге на их устранение.
Из практики: автоматический контроль через линтер быстро вырабатывает команде общий стиль — после этого поддержка тестового проекта становится предсказуемой.
Частые ошибки
Считают, что для тестового кода стандарты не важны.
Дополнительные вопросы
Какие правила проверки кода для автотестов считаешь обязательными?
Как работать с тестовыми данными в автопроверках интерфейса?
Middle
Разделяю постоянные данные (справочники, роли пользователей) и временные данные, создаваемые в ходе теста. Критичные данные создаю через API, а не через UI — это быстрее и надёжнее.
После выполнения очищаю созданные данные или изолирую через транзакции с откатом, чтобы тесты не мешали друг другу.
Из практики: создание данных через UI в setUp — самый медленный и нестабильный подход. Через API это в 10–20 раз быстрее и не зависит от стабильности интерфейса.
Частые ошибки
Готовят данные вручную прямо в ходе каждого теста.
Дополнительные вопросы
Какие данные лучше создавать программно?
Как строить отчёт по результатам автоматических проверок для команды?
Middle
Отчёт должен показывать главное: сколько проверок прошло, где упало, какие падения новые, а какие уже известные нестабильности.
Разделяю новые падения и известные флаки, добавляю тренд стабильности за последние прогоны, чтобы команда видела динамику, а не только срез.
Из практики: хороший отчёт — тот, на который менеджер смотрит 30 секунд и принимает решение о релизе без дополнительных объяснений.
Частые ошибки
Отчёт перегружен деталями и не даёт ответа о риске релиза.
Дополнительные вопросы
Какие блоки считаешь обязательными в отчёте?
Как вы расследуете нестабильный тест, который падает только ночью?
Middle
Сначала смотрю, что меняется ночью: нагрузка, фоновые задачи, ротация логов, обновления данных и расписание интеграций.
Потом сравниваю артефакты успешного и неуспешного запуска, чтобы выделить конкретный фактор.
Из практики: такие падения часто связаны с временем, внешними зависимостями или «грязными» тестовыми данными.
Частые ошибки
Лечат проблему только повторным запуском без поиска причины.
Дополнительные вопросы
Какие артефакты соберёте в первую очередь?
Как понять, что автотест пора рефакторить?
Middle
Сигналы простые: дублирование кода, сложные фикстуры, частые ложные падения и долгое внесение изменений.
Я рефакторю, когда поддержка теста становится дороже, чем его ценность для команды.
Из практики: лучше делать маленький постоянный рефакторинг, чем большой «ремонт» раз в полгода.
Частые ошибки
Откладывают рефакторинг до критического состояния.
Дополнительные вопросы
Какие метрики используете, чтобы решать о рефакторинге?
Как выбрать гранулярность автотестов, чтобы регрессия не была слишком медленной?
Middle
Стараюсь держать баланс: критичные сценарии на верхнем уровне, остальное — ближе к API и модульным проверкам.
Чем дешевле и быстрее тест, тем выше его шанс остаться стабильным в ежедневных прогонах.
Из практики: перенос части UI-проверок на API обычно сильно ускоряет регрессию без потери покрытия.
Частые ошибки
Проверяют всё только через интерфейс.
Дополнительные вопросы
Какие сценарии всё-таки оставите на UI-уровне?
Как построить слой утилит без «божественного» helper-класса?
Middle
Чтобы не получить один огромный helper, делю утилиты по ответственности: данные, API, время, сравнения, генераторы.
Каждая утилита должна быть маленькой, предсказуемой и без скрытой бизнес-логики.
Из практики: модульные утилиты проще тестировать и безопаснее менять при росте проекта.
Частые ошибки
Складывают всё в один общий класс.
Дополнительные вопросы
Как вы решаете, что должно быть утилитой, а что — сервисом?
Как измерять качество набора автотестов, кроме процента прохождения?
Middle
Смотрю стабильность прогона, скорость обратной связи, долю ложных падений и полезность найденных дефектов.
Важно понимать, сколько времени команда тратит на поддержку и разбор, а не только на запуск.
Из практики: высокий процент прохождения мало значит, если тесты не ловят регрессии вовремя.
Частые ошибки
Оценивают качество только по pass rate.
Дополнительные вопросы
Какие метрики вы считаете ключевыми для стабильности набора?
Что такое пирамида тестирования и почему она важна?
Middle
Пирамида: внизу — много быстрых unit-тестов, посередине — интеграционные, наверху — мало end-to-end. Эта форма даёт баланс скорости, надёжности и стоимости поддержки.
Перевёрнутая пирамида (только e2e) — медленно, дорого, нестабильно. Полный отказ от e2e — рискованно для пользовательских сценариев.
Из практики: точное соотношение зависит от проекта, но идея «больше дешёвых и быстрых, меньше дорогих и медленных» остаётся ориентиром.
Частые ошибки
Слепо следовать форме без учёта продукта.
Не иметь хотя бы немного e2e — пропустишь интеграционные баги.
Дополнительные вопросы
Что такое testing trophy?
Где здесь contract testing?
Что такое Page Object Model и какие альтернативы есть?
Middle
POM — паттерн: каждой странице соответствует класс с локаторами и методами действий. Тесты используют эти классы, не зная конкретной разметки.
Альтернативы: Screenplay (роль, действия, вопросы — особенно полезен в Serenity), Component Object (для дизайн-систем), модули с функциями (для маленьких проектов).
Из практики: POM — самый распространённый. Screenplay даёт более выразительный код, но требует переучивания. Для маленьких проектов можно обойтись утилитными функциями.
Частые ошибки
Раздувать POM до анемичных классов с сотнями методов.
Прятать ассерты в POM — теряется читаемость тестов.
Дополнительные вопросы
Что такое Screenplay pattern?
Чем Component Object отличается от Page Object?
Как организовать тестовые данные для автотестов?
Middle
Подходы: builders/factories (создание объектов с нужными полями программно), фикстуры (готовые наборы в файлах), seed-скрипты (наполнение БД при старте), создание данных через API в самом тесте.
Изоляция: каждый тест создаёт свои данные с уникальными идентификаторами (UUID, timestamp), удаляет за собой или живёт в чистой среде.
Из практики: для быстрых тестов лучше создавать через API в коде теста. Для тяжёлых — заранее наполненная БД. Хардкод данных в тестах — анти-паттерн.
Частые ошибки
Зашитые ID в тестах — рассыпаются при пересоздании среды.
Шаринг тестовых данных между тестами — гонки.
Дополнительные вопросы
Что такое test data factory?
Чем хороши fixture-файлы?
Что такое flaky-тест и как с ним бороться?
Middle
Flaky — тест, который то проходит, то падает на одной и той же сборке. Причины: гонки, ожидания фиксированного времени, общие данные, нестабильные внешние зависимости.
Лечение: убрать sleep, перейти на ожидания по состоянию, изолировать данные, мокировать внешние сервисы. На время диагностики тест может быть помечен как quarantine.
Из практики: накопление flaky-тестов разрушает доверие к автотестам. Команды вводят правило — flaky чинят в течение N дней или удаляют.
Стаб (stub) — простой заглушка, возвращающая фиксированные значения. Мок (mock) — проверяет, что был вызов с нужными аргументами (поведенческая проверка). Фейк (fake) — лёгкая работающая реализация (in-memory БД, например).
Стабы и фейки используют для изоляции от внешних зависимостей. Моки — когда важно проверить взаимодействие.
Из практики: для большинства задач хватает стабов и фейков. Моки полезны, но усложняют тест — он становится зависимым от реализации.
Частые ошибки
Использовать моки везде — тесты завязаны на детали реализации.
Считать стаб и мок синонимами в коммуникации.
Дополнительные вопросы
Что такое spy?
Чем mock хуже fake?
Что такое test parallelism и какие подводные камни?
Middle
Параллельный запуск тестов сокращает время прогона. На уровне процессов — отдельные воркеры; на уровне потоков — внутри одного процесса.
Подводные камни: общие тестовые данные, общая БД (нужны схемы/префиксы на тест), shared state в коде тестов, side effects (отправка реальных email, реальные транзакции).
Из практики: чтобы тесты параллелились безопасно — каждый создаёт свои данные с уникальными идентификаторами и не лезет в чужие. CI-runner управляет sharding'ом.
Частые ошибки
Параллелить тесты, использующие общую БД с одной схемой — гонки.
Не настраивать парниковую среду каждому воркеру.
Дополнительные вопросы
Что такое test sharding?
Чем JS-воркер отличается от Java-thread?
Что такое test reports и какие форматы стандартны?
Middle
JUnit XML — стандарт де-факто для CI (Jenkins, GitLab, GitHub Actions парсят и показывают). Allure — мощный HTML-отчёт с шагами, скриншотами, видео, историей.
Также: TestNG XML, HTML-репортеры фреймворков (Playwright HTML, pytest-html). Часто настраивают несколько одновременно.
Из практики: для CI стабильно JUnit XML; для разбора падений — Allure. Хранят как артефакты, чтобы можно было открыть из истории.
Частые ошибки
Не сохранять отчёт как артефакт — нечего смотреть после прогона.
Делать отчёт только в одной форме — теряете интеграции.
Дополнительные вопросы
Что такое Allure history?
Чем Allure лучше HTML-отчёта Playwright?
Что такое test smell?
Middle
Test smell — это «запах», подозрительный паттерн в тесте: тяжёлый setup, длинный тест, дублирование, моки на каждый чих, hardcoded values, condition logic, sleep.
Smells сигнализируют, что тест будет сложно поддерживать или он не очень полезен. Подобно code smells, их учатся видеть и лечить.
Из практики: чаще всего встречаются — fragile test (ломается от любого изменения), obscure test (не понять, что проверяет), slow test, conditional test.
Частые ошибки
Накапливать smells вместо рефакторинга тестов.
Считать, что тестам можно «как угодно» — нет, они тоже код.
Структура AAA: Arrange (подготовить), Act (выполнить), Assert (проверить). Это делает тест понятным с первого взгляда.
Из практики: хороший тест — это документация. Открыл и сразу понимаешь, что и при каких условиях должно работать.
Частые ошибки
Делать тест зависимым от других тестов.
Прятать всё в setup, не показывая, что важно для теста.
Дополнительные вопросы
Что такое AAA pattern?
Чем отличается good test name?
Что такое API mock server и какие популярные?
Middle
Mock server имитирует backend для UI-тестов. WireMock (Java), MSW (JS/browser), json-server, Mockoon, mountebank.
Используется когда: backend нестабилен, нужны конкретные сценарии (ошибки, медленные ответы), для contract-testing.
Из практики: для frontend-разработки и UI-тестов часто незаменим. Для интеграционных — лучше реальный сервис через Testcontainers.
Частые ошибки
Использовать mock везде и не тестировать настоящую интеграцию.
Не синхронизировать mock с реальным API при изменениях.
Дополнительные вопросы
Чем MSW удобен в React-тестах?
Что такое WireMock recording?
Что такое test data builders?
Middle
Паттерн: класс-билдер для тестовых сущностей с дефолтами и удобным API: UserBuilder().name("X").age(30).build(). В тестах указывают только важные для теста поля.
Реализации: ручные builders, или библиотеки (Java: Easy Random, Lombok @Builder; JS: factory.ts с дефолтами).
Из практики: радикально снижает дубль в тестах. Один центральный builder обновляется при изменении модели.
Частые ошибки
Дублировать создание объекта в каждом тесте.
Делать builder без разумных дефолтов.
Дополнительные вопросы
Что такое factory_boy в Python?
Чем builder отличается от fixture?
Что такое test pyramid antipatterns?
Middle
Ice cream cone (мороженое) — много e2e, мало unit. Медленно, хрупко, сложно отлаживать. Hourglass — много unit и e2e, мало integration (пропускают интеграционные баги).
Sometimes — есть только manual + e2e (no unit), что вообще не пирамида.
Из практики: путь к нормальной пирамиде: сначала добавить integration тесты на критичные потоки, потом unit на бизнес-логику, e2e оставить для top-level потоков.
Частые ошибки
Считать ice-cream cone «достаточно хорошим».
Игнорировать integration tests.
Дополнительные вопросы
Что такое testing trophy (по Kent C. Dodds)?
Где здесь contract testing?
Что такое end-to-end test и какие подводные камни?
Middle
E2E тестирует систему целиком через UI или high-level API: пользовательский сценарий от логина до завершения действия.
Из практики: e2e — только на критичные потоки (10-20 на проект). Большинство покрытия — unit и integration. И обязательно retry + good locators.
Частые ошибки
Полагаться только на e2e.
Дублировать в e2e то, что лучше покрыть unit.
Дополнительные вопросы
Что такое end-to-end testing pyramid?
Чем UI-тесты хрупкие?
Что такое test impact analysis?
Middle
Анализ влияния — определение, какие тесты нужно запустить при конкретном изменении кода. Цель — не гонять всё подряд.
Инструменты: Test Impact Analysis в Azure DevOps/Visual Studio (это встроенная фича, а не отдельный продукт), сторонние SeaLights, Launchable, Ekstazi (для JVM).
Из практики: для больших проектов с тысячами тестов окупается. Маленьким — overhead. Альтернатива — sharding и параллелизация.
Частые ошибки
Полагаться на TIA как на 100% — иногда нужны полные регрессии.
Не учитывать изменения в зависимостях.
Дополнительные вопросы
Чем TIA отличается от sharding?
Какие IDE имеют встроенный TIA?
Что такое test isolation?
Middle
Изоляция тестов — каждый тест работает независимо от других. Не зависит от их порядка, состояния, данных.
Достигается: создание данных в setup и удаление в teardown, уникальные идентификаторы (UUID), параллельная безопасность.
Из практики: без изоляции тесты накапливают мусор, гонки, flaky. Это первое, что чинят в нестабильном test-suite.
Частые ошибки
Разделять состояние между тестами для 'скорости'.
Не очищать данные — следующий тест видит мусор.
Дополнительные вопросы
Что такое test pollution?
Как изолировать БД?
Что такое test parallelization strategies?
Middle
Стратегии: по тесту (worker pool, каждый воркер один тест), по файлу (целые файлы), sharding (всё разбивается на N частей и распределяется по разным machines).
Каждая имеет свои подводные камни — состояние БД, общие ресурсы, race conditions.
Из практики: pytest-xdist, Playwright workers, JUnit parallel execution — встроенные решения. Для разных машин — CI-sharding.
Частые ошибки
Параллелить без подготовки — гонки в общих ресурсах.