Как использовать принципы ООП при тестировании

«Как использовать принципы ООП при тестировании» — вопрос из категории ООП, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Принципы ООП помогают строить чистый, поддерживаемый и переиспользуемый тестовый фреймворк. Вот как я их применяю:

  1. Инкапсуляция: Скрываю сложную логику взаимодействия с системой за простыми интерфейсами. Например, создаю класс LoginPage, который инкапсулирует все элементы и методы для работы со страницей входа.

    public class LoginPage {
        private WebDriver driver;
        private By usernameField = By.id("username");
        private By passwordField = By.id("password");
        private By submitButton = By.id("submit");
    
        public LoginPage(WebDriver driver) {
            this.driver = driver;
        }
    
        public HomePage login(String username, String password) {
            driver.findElement(usernameField).sendKeys(username);
            driver.findElement(passwordField).sendKeys(password);
            driver.findElement(submitButton).click();
            return new HomePage(driver);
        }
    }

    Тест тогда становится чистым и читаемым: loginPage.login("user", "pass").verifyWelcomeMessage();

  2. Наследование: Использую для создания базовых тестовых классов с общими настройками (@BeforeEach, @AfterEach) и вспомогательными методами. Все специфичные тестовые классы наследуются от этого базового.

    public class BaseTest {
        protected WebDriver driver;
    
        @BeforeEach
        public void setUp() {
            driver = new ChromeDriver();
            driver.manage().window().maximize();
        }
    
        @AfterEach
        public void tearDown() {
            if (driver != null) {
                driver.quit();
            }
        }
    }
  3. Полиморфизм: Позволяет работать с разными типами объектов через общий интерфейс. Например, можно создать интерфейс Validator с методом validate(), а затем иметь разные реализации для валидации email, номера телефона и т.д. Тест будет вызывать validator.validate(data), не заботясь о конкретной реализации.

  4. Абстракция: Page Object Model (POM) — это прямое применение абстракции. Каждая веб-страница представляется в виде класса, скрывающего детали HTML-структуры и предоставляющего бизнес-ориентированные методы. Это отделяет тестовую логику от деталей реализации UI.

Итог: Такой подход значительно снижает дублирование кода, упрощает поддержку тестов (изменение в UI требует правки только в одном Page Object) и делает тестовую кодбазу структурированной и предсказуемой.