Factory (Фабрика)

Проблема

UI-тесты нередко должны запускаться в нескольких браузерах — Chrome, Firefox, Safari. Без структуры в каждом тесте или @BeforeEach появляется ветвление:

if (browser.equals("chrome")) {
    driver = new ChromeDriver();
} else if (browser.equals("firefox")) {
    driver = new FirefoxDriver();
} else if (browser.equals("safari")) {
    driver = new SafariDriver();
}

Это дублирование кода в каждом тестовом классе. Добавление нового браузера требует ручной правки во многих местах. Тест не должен знать, как создаётся драйвер — это не его ответственность.

Factory централизует логику создания объектов. WebDriverFactory принимает параметр (название браузера, enum, конфигурацию) и возвращает готовый экземпляр драйвера. Тест просто запрашивает драйвер у фабрики. Добавление нового браузера — правка только в одном классе.

Структура модуля

factory/
├── build.gradle
└── src/
    ├── main/
    │   └── java/
    │       └── dev/shipovalov/factory/
    │           ├── Browser.java             # Enum браузеров: CHROME, FIREFOX, SAFARI
    │           └── WebDriverFactory.java    # Фабрика, создающая WebDriver по типу браузера
    └── test/
        └── java/
            └── dev/shipovalov/factory/
                └── FactoryPatternTest.java  # Тест, получающий драйвер через фабрику

Ключевые классы

Класс Назначение
Browser enum с поддерживаемыми браузерами, исключает опечатки в строковых значениях
WebDriverFactory Статический метод create(Browser browser) — вся логика создания драйвера здесь
FactoryPatternTest Демонстрирует получение драйверов для разных браузеров через единый интерфейс

Пример использования

// Без фабрики — создание драйвера прямо в тесте (дублирование в каждом классе)
WebDriver driver = new ChromeDriver(new ChromeOptions());

// С фабрикой — один вызов, детали скрыты
WebDriver driver = WebDriverFactory.create(Browser.CHROME);

// Браузер из системного свойства (для CI/CD)
String browserName = System.getProperty("browser", "chrome");
Browser browser = Browser.valueOf(browserName.toUpperCase());
WebDriver driver = WebDriverFactory.create(browser);

Запуск тестов

./gradlew :factory:test

# Указать браузер через системное свойство
./gradlew :factory:test -Dbrowser=firefox

Отчёт о результатах: factory/build/reports/tests/test/index.html