Шаблон объекта Page и альтернативы - PullRequest
3 голосов
/ 02 февраля 2012

Когда вы автоматизируете тестирование веб-интерфейса, вы хотите организовать свои тесты так, чтобы они были обслуживаемыми, а дублирование кода было минимизировано.Один из способов - это Шаблон Page Object .

Вы пробовали это в реальных проектах?Есть ли альтернативы?Как вы моделируете сложные сайты (несколько вложенных главных страниц, всплывающие окна, большие формы с безумными проверками)?Меня интересуют как общие шаблоны, так и конкретные случаи (Selenium / ASP.NET MVC / NUnit).

Ответы [ 3 ]

5 голосов
/ 02 апреля 2012

Вы задали довольно много вопросов, я постараюсь ответить на некоторые из них.

Я использовал Page Object в веб-приложении с использованием Selenium, а также в настольном приложении WinForms (хотя это не совсем Page Object, я использовал его точно так же - View Object, возможно?).Мой вердикт заключается в том, что он прекрасно работает, и я определенно рекомендую его.

Вот краткий пример того, как может выглядеть тест, как мы его написали:

[Test]
public void AccountPageNameIsLoggedInUsersName()
{
    FirstPage() // Returns FirstPage
        .LoginAs("tobbe", "s3cr3t") // Returns LoggedInPage
        .ClickOnMyAccount() // Returns MyAccountPage
        .AssertThat(p => p.Name, Is.EqualTo("tobbe")); // p is of type MyAccountPage
}

Здесь,магия селена находится внутри метода FirstPage () и страниц.Таким образом, вы скрываете все ненужные детали реализации из теста.Полагаю, вы можете понять, как реализованы методы.

Бонус от сокрытия содержимого Selenium внутри страниц заключается в том, что вы можете, не меняя тест, преобразовать его, например, в тест Model-View-Presenter, гдеPageObject представляет представление (это похоже на то, что я делал в приложении WinForms).

Что касается главных страниц, мы сделали то, что мы украсили страницы интерфейсом и создали методы расширения для этих интерфейсов:

public class LoggedInPage : Page<LoggedInPage>, IMainMenuHolder { ... }

public static class MainMenuHolderExtensions
{
    public static MyAccountPage ClickOnMyAccount(this IMainMenuHoder me) { ... }
}
2 голосов
/ 02 февраля 2012

Мы начали использовать его, так как оно имеет смысл. Но мы не хотели писать общий код сами по себе, поэтому мы искали библиотеку, которую могли бы использовать. Мы нашли Геб . Мы уже используем Spock , поэтому Geb + Spock - очень хорошее совпадение.

1 голос
/ 03 апреля 2014

Я написал о сложных объектах страницы в моем блоге.См. http://burdettelamar.wordpress.com/2014/03/21/keep-your-page-objects-dry/

Идея состоит в том, чтобы поделиться общими элементами страницы с наследованием (я пишу на C #).В Ruby вы можете использовать дополнения;в Python, модули и т. д.

...