HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: java, автоматизированное тестирование, паттерн factory</p>
1 <p>Теги: java, автоматизированное тестирование, паттерн factory</p>
2 <p>Многие начинающие автоматизаторы мало что слышали о паттернах из "мира разработки". Казалось бы, зачем в автоматизированном тестировании такие шаблоны, как Singleton, Adapter, Builder? Они решают другие задачи, которых нет (в большинстве случаев) в мире автоматизированного тестирования. Однако это не так. Многие шаблоны можно и нужно использовать в разработке тестов. И сегодня речь пойдет об одном из них, а именно о Factory.</p>
2 <p>Многие начинающие автоматизаторы мало что слышали о паттернах из "мира разработки". Казалось бы, зачем в автоматизированном тестировании такие шаблоны, как Singleton, Adapter, Builder? Они решают другие задачи, которых нет (в большинстве случаев) в мире автоматизированного тестирования. Однако это не так. Многие шаблоны можно и нужно использовать в разработке тестов. И сегодня речь пойдет об одном из них, а именно о Factory.</p>
3 <h2>Что такое Factory?</h2>
3 <h2>Что такое Factory?</h2>
4 <p>Википедия гласит:<em>В объектно-ориентированном программировании (ООП), фабрика - это объект для создания других объектов. Формально фабрика - это функция или метод, который возвращает объекты изменяющегося прототипа или класса из некоторого вызова метода, который считается "новым".</em></p>
4 <p>Википедия гласит:<em>В объектно-ориентированном программировании (ООП), фабрика - это объект для создания других объектов. Формально фабрика - это функция или метод, который возвращает объекты изменяющегося прототипа или класса из некоторого вызова метода, который считается "новым".</em></p>
5 <p>Или, простыми словами, фабрика создает нам экземпляр класса без раскрытия логики его создания.</p>
5 <p>Или, простыми словами, фабрика создает нам экземпляр класса без раскрытия логики его создания.</p>
6 <p>Для понимания, зачем нам нужно его использовать, следует сначала понять проблему, который решает этот паттерн.</p>
6 <p>Для понимания, зачем нам нужно его использовать, следует сначала понять проблему, который решает этот паттерн.</p>
7 <p>Для примера рассмотрим следующий код:</p>
7 <p>Для примера рассмотрим следующий код:</p>
8 @Test void test(){ ChromeDriver driver = new ChromeDriver(); driver.get("https://otus.ru"); Assert.assertEquals(driver.getTitle(),"Otus - онлайн образование"); }<p>Данный тест запускает Chrome, проверяет, что title страницы совпадает с ожидаемым. Мы создаем еще несколько таких тестов, добавляем их в скоуп тестирования для параллельного тестирования и, вроде, все хорошо ровно (за исключением нарушений принципов DRY и SOLID) до момента, когда у нас не встает вопрос о том, чтобы запускать тесты в другом браузере, запускать браузер с какими-то параметрами или с определенными расширениями.</p>
8 @Test void test(){ ChromeDriver driver = new ChromeDriver(); driver.get("https://otus.ru"); Assert.assertEquals(driver.getTitle(),"Otus - онлайн образование"); }<p>Данный тест запускает Chrome, проверяет, что title страницы совпадает с ожидаемым. Мы создаем еще несколько таких тестов, добавляем их в скоуп тестирования для параллельного тестирования и, вроде, все хорошо ровно (за исключением нарушений принципов DRY и SOLID) до момента, когда у нас не встает вопрос о том, чтобы запускать тесты в другом браузере, запускать браузер с какими-то параметрами или с определенными расширениями.</p>
9 <p>И в решении данной проблемы нам можем помочь паттерн Factory.</p>
9 <p>И в решении данной проблемы нам можем помочь паттерн Factory.</p>
10 <p>Рассмотрим простейшую фабрику. Для этого нам нужно создать функцию, которая принимает на вход название браузера и возвращает соответствующий браузер (если браузер был указан некорректно - выбросит ошибку с соответствующим сообщением).</p>
10 <p>Рассмотрим простейшую фабрику. Для этого нам нужно создать функцию, которая принимает на вход название браузера и возвращает соответствующий браузер (если браузер был указан некорректно - выбросит ошибку с соответствующим сообщением).</p>
11 WebDriver getWebDriver(String browserName){ switch (browserName){ case "chrome": return new ChromeDriver(); case "firefox": return new FirefoxDriver(); default: throw new RuntimeException("Incorrect BrowserName"); } }<p>Теперь нам в тесте будет достаточно вызвать соответствующий метод для получения Webdriver'a:</p>
11 WebDriver getWebDriver(String browserName){ switch (browserName){ case "chrome": return new ChromeDriver(); case "firefox": return new FirefoxDriver(); default: throw new RuntimeException("Incorrect BrowserName"); } }<p>Теперь нам в тесте будет достаточно вызвать соответствующий метод для получения Webdriver'a:</p>
12 @Test void test(){ WebDriver driver = getWebDriver("chrome"); driver.get("https://otus.ru"); Assert.assertEquals(driver.getTitle(),"Otus - онлайн образование"); }<p>Готово! Теперь при изменении параметров запуска браузера (к примеру, нам требуется добавить Cookie), это можно будет сделать из одного места, а вашему коллеге не надо будет думать, все ли он указал в параметрах запуска.</p>
12 @Test void test(){ WebDriver driver = getWebDriver("chrome"); driver.get("https://otus.ru"); Assert.assertEquals(driver.getTitle(),"Otus - онлайн образование"); }<p>Готово! Теперь при изменении параметров запуска браузера (к примеру, нам требуется добавить Cookie), это можно будет сделать из одного места, а вашему коллеге не надо будет думать, все ли он указал в параметрах запуска.</p>
13  
13