Какие паттерны GOF вам известны? Приведите примеры их использования.qa-40

Классификация паттернов GOF

23 классических паттерна, разделенных на 3 категории:
1. Порождающие (Creational)
2. Структурные (Structural)
3. Поведенческие (Behavioral)

1. Порождающие паттерны

Singleton

Гарантирует, что класс имеет только один экземпляр.

Применение в QA:

public class TestConfig {
    private static TestConfig instance;
    private Properties props;

    private TestConfig() { loadProperties(); }

    public static TestConfig getInstance() {
        if (instance == null) {
            instance = new TestConfig();
        }
        return instance;
    }
}

Использование: Для хранения глобальной конфигурации тестов.

Factory Method

Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.

Пример:

public interface WebDriverFactory {
    WebDriver createDriver();
}

public class ChromeDriverFactory implements WebDriverFactory {
    public WebDriver createDriver() {
        return new ChromeDriver();
    }
}

2. Структурные паттерны

Page Object

Инкапсулирует работу с элементами страницы в отдельный класс.

Пример:

public class LoginPage {
    private WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    public void login(String user, String pass) {
        driver.findElement(By.id("username")).sendKeys(user);
        driver.findElement(By.id("password")).sendKeys(pass);
        driver.findElement(By.id("login-btn")).click();
    }
}

Decorator

Динамически добавляет объекту новые обязанности.

Применение:

public abstract class WebElementDecorator implements WebElement {
    protected WebElement element;

    public WebElementDecorator(WebElement element) {
        this.element = element;
    }

    // Декорируем метод click
    @Override
    public void click() {
        System.out.println("Clicking on element");
        element.click();
    }
}

3. Поведенческие паттерны

Observer

Определяет зависимость "один-ко-многим" между объектами.

Пример в тестировании:

public class TestStatusNotifier {
    private List<TestListener> listeners = new ArrayList<>();

    public void addListener(TestListener listener) {
        listeners.add(listener);
    }

    public void testFailed(String testName) {
        for (TestListener l : listeners) {
            l.onTestFailure(testName);
        }
    }
}

Strategy

Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.

Применение:

public interface ScreenshotStrategy {
    void takeScreenshot(WebDriver driver, String name);
}

public class FullPageScreenshot implements ScreenshotStrategy {
    public void takeScreenshot(WebDriver driver, String name) {
        // Реализация для полной страницы
    }
}

Другие полезные паттерны в QA

Builder

Пошаговое создание сложного объекта.

Пример тестовых данных:

User user = new User.Builder()
    .withUsername("testuser")
    .withEmail("test@example.com")
    .withActiveStatus(true)
    .build();

Proxy

Предоставляет объект-заместитель, контролирующий доступ к другому объекту.

Использование для логгирования:

public class LoggingWebElementProxy implements InvocationHandler {
    private WebElement element;

    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("Calling: " + method.getName());
        return method.invoke(element, args);
    }
}

Резюмируем

Наиболее полезные паттерны для QA:

  1. Page Object - организация автотестов
  2. Singleton - конфигурация, драйвер
  3. Factory - создание тестовых данных
  4. Observer - обработка событий тестирования
  5. Decorator - расширение функционала

Польза от знания паттернов:

  • Лучшее понимание архитектуры приложения
  • Умение создавать поддерживаемые тестовые фреймворки
  • Эффективная коммуникация с разработчиками
  • Написание более чистого и гибкого кода автотестов

Паттерны - это не догма, а инструменты для решения типовых задач проектирования ПО. В QA особенно важно понимать Page Object, Factory и Singleton как наиболее часто применяемые.