Какие паттерны проектирования знаешь и применял в тестировании?

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

Ответ

В автоматизации тестирования я активно использую несколько паттернов для повышения поддерживаемости и читаемости кода.

Page Object (PO) — основной паттерн для UI-тестов. Я создаю отдельные классы для каждой страницы или компонента, которые инкапсулируют локаторы и методы взаимодействия с элементами.

public class LoginPage {
    private WebDriver driver;
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By loginButton = By.id("login-btn");

    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(loginButton).click();
        return new HomePage(driver);
    }
}

Factory — использую для создания драйверов в кросс-браузерном тестировании:

public class DriverFactory {
    public static WebDriver createDriver(String browser) {
        switch(browser.toLowerCase()) {
            case "chrome":
                return new ChromeDriver();
            case "firefox":
                return new FirefoxDriver();
            case "edge":
                return new EdgeDriver();
            default:
                throw new IllegalArgumentException("Unsupported browser: " + browser);
        }
    }
}

Singleton — применяю для управления единственным экземпляром WebDriver в рамках тестового прогона, что особенно важно при параллельном запуске тестов с использованием ThreadLocal.

Builder — полезен для создания сложных тестовых данных с множеством необязательных полей. Например, при тестировании форм регистрации:

User user = new UserBuilder()
    .withUsername("testuser")
    .withEmail("test@example.com")
    .withAge(25)
    .build();

Decorator — использовал для добавления логирования действий в драйвер без изменения его исходного кода.

Strategy — применял для реализации разных стратегий авторизации в тестах (через UI, API, или mock-авторизацию).

Видео-ответы