Как стать автором
Обновить

Оля, тесты и фабрика — путь к красивой архитектуре и чистоте кода

Время на прочтение 17 мин
Количество просмотров 9.8K
Всего голосов 15: ↑15 и ↓0 +15
Комментарии 10

Комментарии 10

Все хорошо, только вы описали не фабрику, а частный случай fluent interface. Я еще кое-как соглашусь, что под капотом используется фабричный метод, а вот фабрикой в принципе не пахнет.
А вообще рекомендую впилить IoC контейнер. Решает многие надуманные проблемы.

PS: тесты может и пишутся просто, а вот поддержка тестов с fluent interface может быть очень болезненной.
IoC контейнер — это действительно интересно. Тоже думали об этом, и, вероятно, попробуем перейти на такой подход в ближайшем будущем
А диавол должон быть за левым плечом!
срисовала с зеркала и все перепутала
Борода тоже с зеркала?

Крутая статья, спасибо! Как-то думал написать про свой опыт, а теперь не нужно, буду ссылаться на вашу статью :-)

Очень рада, что понравилось. Спасибо!)

а в чем сложность написать так?


class ExampleLoginTestSuit: BaseTestCase {

func testExampleLogin() {
        let user = userFixtureService.createUser()

        mainScreen
          .openProfileTab()
          .goToAuthorization()
          .goToLogin()
          .enterLogin(user.login)
          .enterPassword(user.password)
          .logIn()   
   }
}</source>

где "openProfileTab" возвращает "ProfileScreen" класс напрямую.

Мы именно так  пишем на Java: "return new SomePage(driver)". Только еще драйвер передаем.
В примере с цепочкой вызовов методов у меня именно так и написано. За исключением, что в вашем примере нужно еще дополнительно создать объект экрана mainScreen, то есть
let mainScreen = pageObjectFactory.makeMainScreenPageObject()

Ну или если у вас нет дополнительных параметров при инициаилизации PO-в и вы не выносите их в фабрику, то
let mainScreen = MainScreenPageObject()

openProfileTab() у нас так же возвращает ProfileScreen().

Если вопрос про описанные сложности с таббаром, то тут суть, что openProfileTab() должен быть доступен не только с MainScreen, но и с почти любого другого PO-а.
Ну типа того. Только вместо «pageObjectFactory» у нас «myApp», где конструктор с драйвером.
далее внутри myApp все поделено по функционалу, а сама myApp инициализируется автоматом перед тестом.

Таким образом получилось типа того:

		myApp()
                .homePage()
                .tapSomeButton()
                .isSomePageLoaded()
                .tapSomeButton();

        // если нужен переход на иную станичку в тесте, чем обычно
        myApp()
                .login().loginPage()
                .isLoginPageLoaded()
                .tapSomeButton()

А доступность какой-то странички всем другим страницам в Java просто решается добавлением ее в BasePage класс. В принципе похоже на вас.

ЗЫ в общем меня смутил у вас лишь «return pageObjectsFactory.makeMainScreenPageObject()», а не к примеру «return new SomePage()».
Зарегистрируйтесь на Хабре , чтобы оставить комментарий