Какие принципы ООП используешь в тестах?
Что проверяют
Пишете ли вы автотесты как поддерживаемый код или как набор скриптов с копированием локаторов. Следом обычно просят показать структуру своего фреймворка: где лежат локаторы, где проверки и что происходит, когда меняется вёрстка.
Как отвечать
Привязывайте каждый принцип к конкретной части фреймворка, а не к определению из учебника:
- инкапсуляция: Page Object прячет локаторы в приватных полях и отдаёт наружу действия вроде
loginAs(user). Сменилась вёрстка, правится один класс, а не сорок тестов; - абстракция: тест читается на языке сценария,
cartPage.addItem(...), безfindElementи явных ожиданий. Работа с драйвером уходит в слой ниже; - наследование:
BasePageс общими ожиданиями иBaseTestс подъёмом и закрытием браузера. Иерархию держат в один-два уровня; - полиморфизм: общий интерфейс
LoginPageс реализациями для веба и мобильного приложения или один интерфейс API-клиента для разных окружений. Тест работает с интерфейсом и не знает, что под ним.
Сильный ответ добавляет композицию: повторяющиеся блоки вроде шапки, модального окна или таблицы выносятся в компоненты, которые страница содержит, а не наследует. Для тестовых данных уместен Builder: User.builder().withRole(ADMIN).build() вместо конструктора на десять параметров.
Назовите свой стек: Selenium или Selenide, Playwright, JUnit 5 или TestNG, pytest. В pytest часть задач BaseTest решают фикстуры, и это нормально сказать. Если фреймворк вы не строили сами, честно опишите, чем пользовались, что в нём мешало и что бы вы изменили.
Где спотыкаются
Пересказывают определения ООП без привязки к тестам. Интервьюер ждёт «локаторы спрятаны в Page Object», а не «инкапсуляция это сокрытие данных».
Раздувают BaseTest до сотен строк и многоуровневого наследования. Тест начинает зависеть от состояния, которое настроил неизвестно какой предок, и разбирать падения становится трудно.
Кладут проверки внутрь Page Object или отдают наружу WebElement. Тогда страница сама решает, что считать ошибкой, а тест снова работает с локаторами напрямую.