页面对象模式和替代方案

时间:2012-02-02 03:18:53

标签: design-patterns testing automated-tests

当您自动化Web UI测试时,您希望组织测试以使其可维护并尽可能减少代码重复。要走的路是Page Object pattern

你在现实世界的项目中尝试过吗?还有其他选择吗?你如何模拟复杂的网站(几个嵌套的母版页,弹出窗口,大型表格与疯狂的验证)?我对一般模式以及特定情况(Selenium / ASP.NET MVC / NUnit)感兴趣。

3 个答案:

答案 0 :(得分:5)

你问过很多问题,我会尝试回答其中的一些问题。

我在使用Selenium和桌面WinForms应用程序的Web应用程序中使用了Page Object(虽然这不是严格的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
}

这里,Selenium magic放在FirstPage()方法和页面内。这样,您可以隐藏测试中所有不必要的实现细节。我想你可以弄清楚这些方法是如何实现的。

将Selenium内容隐藏在页面中的一个好处是,您可以在不更改测试的情况下将其转换为例如一个Model-View-Presenter测试,其中PageObject表示视图(类似于我在WinForms应用程序中所做的那样)。

关于母版页,我们所做的是用界面装饰页面并在这些界面上创建扩展方法:

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

public static class MainMenuHolderExtensions
{
    public static MyAccountPage ClickOnMyAccount(this IMainMenuHoder me) { ... }
}

答案 1 :(得分:2)

我们开始使用它,因为它是有道理的。但是我们不想编写自己的公共代码,所以我们四处寻找可以利用的库。我们找到了Geb。我们已经在使用Spock,所以Geb + Spock非常匹配。

答案 2 :(得分:1)

我在博客上写过关于复杂页面对象的文章。见http://burdettelamar.wordpress.com/2014/03/21/keep-your-page-objects-dry/

这个想法是与继承共享公共页面元素(我用C#编写)。在Ruby中,您可以使用混合;在Python,模块等