页面对象模式和替代方案

Use*_*rol 3 testing automated-tests design-patterns

当您自动化Web UI测试时,您希望组织测试以使其可维护并尽可能减少代码重复.要走的路是页面对象模式.

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

Tor*_*lin 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
}
Run Code Online (Sandbox Code Playgroud)

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

将Selenium内容隐藏在页面中的一个好处是,您可以在不更改测试的情况下将其转换为例如ModelObject-Presenter测试,其中PageObject表示视图(这与我在WinForms应用程序中的操作类似).

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

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

public static class MainMenuHolderExtensions
{
    public static MyAccountPage ClickOnMyAccount(this IMainMenuHoder me) { ... }
}
Run Code Online (Sandbox Code Playgroud)