Как применяется ООП в автотестах
Что проверяют
Пишете ли вы автотесты как поддерживаемый код или как скрипт на тысячу строк с дублированием локаторов. Принципы ООП назвать может каждый, поэтому следом просят показать их на своём фреймворке и спрашивают, где наследование в тестах вредит.
Как отвечать
Покажите каждый принцип на реальной части фреймворка:
- инкапсуляция: Page Object прячет локаторы и ожидания внутри класса. Тест вызывает
loginPage.loginAs(user)и не знает, каким селектором найдено поле. Сменили вёрстку, правите один класс; - наследование:
BasePageс общими ожиданиями и шапкой, базовый API-клиент с авторизацией и логированием запросов. Для настройки окружения лучше подходят фикстуры pytest или расширения JUnit 5, чем глубокая цепочкаBaseTest; - полиморфизм: тест работает с
WebDriver, а фабрика подставляет Chrome, Firefox или удалённый драйвер. Или один сценарий оплаты гоняется для разных способов через общий интерфейс; - абстракция: тест говорит на языке предметной области (
cart.addItem,api.createOrder), а HTTP, JSON и ожидания спрятаны ниже.
Вокруг этого живут паттерны: Page Object и компоненты (шапка, таблица, модалка как отдельные объекты внутри страниц), Builder для тестовых данных (UserBuilder().withRole(ADMIN).build()), Factory для драйверов, Strategy для разных окружений. Методы Page Object обычно возвращают следующую страницу, так сценарий читается цепочкой.
Хороший ответ заканчивается принципом «композиция важнее наследования»: страница собирается из компонентов, а не наследуется от пяти родителей.
Где спотыкаются
Кладут проверки внутрь Page Object. Страница должна уметь действовать и отдавать состояние, а решать, правильно ли это, должен тест. Иначе один класс начинает зависеть от ожиданий десятка сценариев.
Делают WebDriver синглтоном в статическом поле. При параллельном запуске потоки делят один браузер, и тесты падают случайно. Нужен драйвер на поток, например через ThreadLocal, или отдельный экземпляр на тест.
Строят иерархию BaseTest → UiBaseTest → AuthUiBaseTest, где непонятно, какой setUp что сделал. Любое изменение в базовом классе ломает половину набора.