分支逻辑的软件设计模式?

时间:2018-02-02 14:37:47

标签: selenium design-patterns automated-tests ui-automation pageobjects

在测试自动化的环境中,我正在使用页面对象模式的简单版本,并面临代码中存在冗余的问题。

那就是说,在一个类中,我有多个方法基本上做同样的事情但只返回不同的页面对象:

class Checkout {
    gotoNextPageExpectCreditCardPage() {
       clickSubmitButton();
       return new CreditCardPage();
    };

    gotoNextPageExpectPaypalPage() {
       clickSubmitButton();
       return new PaypalPage();
    };

    ...

    gotoNextPageExpectErrorPage() {
       clickSubmitButton();
       return new ErrorPage();
    };
}

我做过一些研究并想到了一些设计模式,比如状态模式,模板方法,责任链,但我也认为这些可能是过度的,我将不得不做一个巨大的重构。

有人想出一个更简单的解决方案吗?

PS:我正在使用node.js

1 个答案:

答案 0 :(得分:1)

PageObjectModel有其优点和缺点,就像任何其他模式一样。也许您需要再次考虑您的情况以及为什么您正在使用它。在大多数教程中,您会发现,它实现起来非常简单易行,但这些解决并证明了玩具问题,而不是现实生活中的问题。我只在测试框架API支持设计的地方使用POM,例如pywinauto。这里的概念允许您链接元素,如下所示:

app.UntitledNotepad.Edit

没有必要在整个代码库中重复这样的屏幕结构,只需将UI细节放在POM中,并在需要交互时提供元素。

notepad.EditInput.type_keys("pywinauto Works!", with_spaces = True)

正如您所看到的 - 这离Selenium和Web自动化很远。但, 你可以找到很多其他的模式:

  • Object repository在UI测试脚本可维护性方面非常有用,我已经在很多大项目中使用它并取得了巨大成功(例如,mSOA平台有超过40个网站)
  • Screenplay是一个以用户为中心的模型,它可以帮助您将自动验收测试的重点从与系统的低级交互转移到思考系统用户是谁,他们想要什么通过他们与您的系统的互动来实现,以及他们将如何做到这一点。
  • Mission可帮助您模块化代码并创建描述软件用户业务或功能交互的角色。

瞄准完整答案 - xUnit世界中其他模式的很好集合是xunitpatterns。但是,您正在构建的测试框架没有单一的模式解决方案。人们应该遵循并使用其他设计原则和概念。例如,您的域逻辑(特定于业务)应该在DSL中分层,不了解底层驱动程序或更高级别BDD规范。