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

Software design pattern for branching logic?

在测试自动化的上下文中,我使用了页面对象模式的简单版本并面临代码冗余的问题。

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

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

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

    ...

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

我已经做了一些研究并想到了一些设计模式,例如状态模式、模板方法、责任链,但我也认为这些可能有点矫枉过正,我将不得不进行大量重构。

有没有人想出更简单的解决方案?

PS.: 我正在使用 node.js

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

app.UntitledNotepad.Edit

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

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

如您所见 - 这与 Selenium 和 Web 自动化相去甚远。但, 您可以寻找许多其他模式:

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

旨在获得完整答案 - xUnit 世界中其他模式的一个很好的集合是 xunitpatterns. However, there is not a single pattern solution for your test framework you are building. One should follow and use other design principles and concepts as well. For example, your domain logic (business specific) should be layered in a DSL, having no knowledge of underlying drivers or higher level BDD 规范。