2012-02-02 1 views
3

Когда вы автоматизируете тестирование веб-интерфейса, вы хотите организовать свои тесты, чтобы они были ремонтопригодными, а дублирование кода было сведено к минимуму. На пути - Page Object pattern.Страница шаблона объекта и его альтернативы

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

ответ

5

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

Я использовал объект страницы в веб-приложении, используя Selenium, а также в рабочем приложении WinForms (хотя это не строго объект страницы, я использовал его таким же образом - 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

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

Смежные вопросы