Как я могу перейти на определенную страницу в тесте Appium при использовании шаблона проектирования объектной модели страницы?

Мои тесты Appium работают без сбоев для моего приложения для Android. Кодируется с использованием Maven и Kotlin. В моем приложении есть только одно действие LAUNCHER - моя SplashScreenActivity.

В настоящее время у меня есть класс baseTest, который обеспечивает функциональность на уровне ОС, например waitForElement или swipeScreen(dir: Direction, amount: Int).

Затем у меня есть класс AppTest, который расширяет его и предоставляет некоторые функции, специфичные для приложения. Наиболее важным является функция с именем startApp(), которая запускает мое приложение, входит в систему как тестовый пользователь и переходит на мой домашний экран. Затем каждый тест для определенного пользовательского интерфейса расширяет этот класс AppTest и создает свою собственную функцию getToUI, которая просто запускает функцию startApp, а затем автоматизирует несколько нажатий других кнопок, чтобы перейти к конкретному тестируемому пользовательскому интерфейсу.

Теперь я пытаюсь добавить в свои тесты шаблон проектирования объектной модели страницы. Как мне реализовать такую ​​навигацию в тестируемом пользовательском интерфейсе? Должен ли я помещать код для перехода на страницу в инициализации каждого класса страницы? Или есть более изящное решение?


person szaske    schedule 18.12.2020    source источник
comment
Итак, вы пытаетесь сделать что-то вроде someElement.click(). С каким-то элементом, содержащим идентификатор и логику щелчка?   -  person PureVodka    schedule 19.12.2020
comment
нет, я спрашиваю, как вы вообще попали на страницу. В моем приложении вы должны сначала войти в систему и, возможно, нажать 5 кнопок, чтобы перейти на страницу, которую я хочу протестировать. Ни один из примеров, которые я видел, не объясняет, как вы должны попасть на страницу пользовательского интерфейса, которую хотите протестировать. В примерах, которые я видел, просто говорится, что создание новой страницы LoginPage (Driver) теперь начинается с нажатия элементов. Как мое приложение должно сначала попасть на страницу LoginPage, прежде чем я смогу запустить тест Appium?   -  person szaske    schedule 19.12.2020
comment
Вы делаете это на Java или C #?   -  person PureVodka    schedule 19.12.2020
comment
Я тестирую это в Котлине и в приложении для Android. Как только я получу эту работу, я попытаюсь заставить работать приложение IOS.   -  person szaske    schedule 19.12.2020
comment
В любом случае, вы могли бы создать абстрактный класс с помощью метода Login (). Это приведет вас к одной и той же точке входа для всех ваших тестов. Тогда все ваши тесты просто наследуют абстрактный класс. Если вы делаете это на Java с помощью комбо TestNG, я мог бы более подробно остановиться.   -  person PureVodka    schedule 19.12.2020
comment
Я совсем не разбираюсь в Kotlin, однако, как я полагаю, вы могли бы, по крайней мере, создать класс со статическим методом, который выполняет вход за вас - предостережение в том, что вам придется вызывать его каждый тест. Если вы можете унаследовать его, вы можете сделать все это в конструкторе абстрактного класса. Таким образом, ваш new MyTest() вызовет GenericTest() как base / super, а базовый конструктор GenericTest проведет его через шаги входа в систему.   -  person PureVodka    schedule 19.12.2020


Ответы (2)


Если вы хотите только оптимизировать способ перехода на страницу при тестировании определенного пользовательского интерфейса, я бы рекомендовал использовать команда запуска Appium, при условии, что пользовательский интерфейс не является фрагментом.

Существуют способы подделать функциональность входа в систему, то есть создать тестовый токен аутентификации и добавить его в заголовки HTTP или добавить cookie аутентификации и отправить его вместе с HTTP-запросом, но это более специфично для того, как аутентификация реализована в вашем проекте.

В тесте стиля BDD это должно выглядеть так:

given: a user and user is logged in
when: user opens SOME PAGE
then: SOME VALIDATION HERE
person Syed Affan Hamdani    schedule 19.12.2020

Объектная модель страницы - это просто абстракция. Вам решать, на каком уровне детализации: это может быть фрагмент приложения, экран пользовательского интерфейса, часть экрана пользовательского интерфейса и т. Д.

У вас также может быть один глобальный класс Actions для обертывания общих действий, например запускать / перезапускать приложение, запускать действия, переводить приложение в фоновый режим и т. д.

Предполагая, что вы должны войти в систему один раз, а затем, чтобы ускорить работу, вы просто перезапустите активность, это может выглядеть так:

before:

LoginScreen loginScreen = Actions.launchApp(); // should load login screen
HomeScreen home = loginScreen.loginWithValidUser();
beforeEach:

HomeScreen homeScreen = Actions.launchHomeActivity() // no need to login, it is cached, just restart activity; maybe you need to make server API call to flush user data?
test

UserProfileScreen userScreen = homeScreen.openUserProfile()
userScreen.changePassword(newPassword)
userScreen.save()
Actions.navigateBack()

homeScreen....

Тем не менее, вы должны вернуть экземпляр PO во время перехода на другой экран. Хорошо иметь статические функции, индивидуальный вкус и удобство использования.

person dmle    schedule 22.12.2020