История вопроса:
Изначально автоматические тесты часто писались "в лоб", без архитектурных разделений: логика проверки и механизмы исполнения перемешивались. С ростом проектов стало очевидно, что смешивание фреймворка и тест-логики создает хрупкую, трудно поддерживаемую кодовую базу. Появились архитектурные рекомендации по разделению ответственности.
Проблема:
Если тесты зависят от внутренних реализаций фреймворка или включают логику взаимодействия с окружением, любые изменения вынуждают переписывать множество тестов. Тест-кейсы сложны, дублируется код, затруднена миграция на новый фреймворк или платформу.
Решение:
Строго разделять:
Ключевые особенности:
Можно ли писать тестовые шаги напрямую в тестах, если их очень немного?
Не стоит. Даже короткие тесты могут вырасти, и отсутствие слоев быстро приведет к хаосу.
Должны ли тестовые сценарии знать о механике запуска (например, когда инициализировать драйвер)?
Нет. Все детали инфраструктуры должны скрываться в слое фреймворка.
Нормально ли хардкодить параметры тестов внутри кейсов (например, url, креды)?
Нет. Параметры тестов должны конфигурироваться через настройки фреймворка и окружения.
В проекте тесты напрямую вызывают методы драйвера Selenium, в каждом тесте повторяется подключение к WebDriver. Каждый тест самостоятельно парсит конфиг.
Плюсы:
Минусы:
Тесты используют базовые абстракции фреймворка: общая инициализация и teardown, сквозная передача параметров через конфигуратор, тест-логика выражается через высокоуровневые методы.
Плюсы:
Минусы: