Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 页面对象模式和备选方案_Design Patterns_Testing_Automated Tests - Fatal编程技术网

Design patterns 页面对象模式和备选方案

Design patterns 页面对象模式和备选方案,design-patterns,testing,automated-tests,Design Patterns,Testing,Automated Tests,当您自动化web UI测试时,您希望组织您的测试,以便它们是可维护的,并且尽可能减少代码重复。在去的路上是 你在现实世界的项目中尝试过吗?还有其他选择吗?如何对复杂的站点(很少嵌套的母版页、弹出窗口、带有疯狂验证的大型表单)建模?我对一般模式以及特定情况(Selenium/ASP.NET MVC/NUnit)感兴趣。我们开始使用它,因为它是有意义的。但我们不想自己编写公共代码,所以我们四处寻找一些可以利用的库。我们找到了。我们已经在使用Geb+Spock了,所以Geb+Spock是一个很好的搭配

当您自动化web UI测试时,您希望组织您的测试,以便它们是可维护的,并且尽可能减少代码重复。在去的路上是


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

我们开始使用它,因为它是有意义的。但我们不想自己编写公共代码,所以我们四处寻找一些可以利用的库。我们找到了。我们已经在使用Geb+Spock了,所以Geb+Spock是一个很好的搭配。

您已经问了很多问题,我将尝试回答其中一些问题

我在使用Selenium的web应用程序和桌面WinForms应用程序中使用了Page对象(虽然这不是严格意义上的Page对象,但我也以同样的方式使用了它--可能是View对象?)。我的结论是它非常有效,我绝对推荐它

下面是一个简短的示例,说明了测试可能是什么样子,以及我们编写测试的方式:

[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魔术被放置在FirstPage()方法和页面中。通过这种方式,您可以对测试隐藏所有不必要的实现细节。我想您可以了解这些方法是如何实现的

将Selenium内容隐藏在页面中的好处是,您可以在不更改测试的情况下将其转换为模型视图演示器测试,其中PageObject表示视图(这与我在WinForms应用程序中所做的类似)

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

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

public static class MainMenuHolderExtensions
{
    public static MyAccountPage ClickOnMyAccount(this IMainMenuHoder me) { ... }
}
public类LoggedInPage:Page,IMainMenuHolder{…}
公共静态类MainMenuHolderExtensions
{
公共静态MyAccount页面ClickOnMyAccount(此IMainMenuHoder me){…}
}

我在博客上写过关于复杂页面对象的文章。看

其思想是通过继承共享公共页面元素(我用C#编写)。在Ruby中,可以使用mix-ins;在Python、模块等中