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