用于处理方案中日期重用的设计模式 (BDD)



我希望您对我的方案提出建议:

我正在使用 bdd 技术与 Cucumber 和 Selenium WebDriver 工具一起实现自动化测试,目前发生的事情是:很多场景都依赖于彼此的数据,所以现在我将这些数据存储在我定义步骤的类中,所以我可以在其他场景中使用。

但是,随着应用程序的增长,我得到的场景越多,我的应用程序就越混乱。

在这种情况下,您有任何设计模式或解决方案可以使用吗?

正如您所说,依赖于其他场景数据的场景变得复杂而混乱。执行顺序很重要。

如果以随机顺序执行方案会发生什么?这会对你产生什么影响?

我的方法是努力使每个场景彼此独立。如果您有一个流程,例如下订单,该订单是准备创建发票等所需的装运所必需的,那么我将确保在每个方案之前应用程序的状态设置正确。也就是说,执行创建所需状态的代码。

这是一种复杂的说法,为了创建发票,我必须首先设置应用程序状态,以便它已准备好装运。以及可能的其他事情。

在执行任何方案之前,我会努力将应用程序设置为已知状态。如果这意味着清理数据库,那么我会这样做。目标是能够独立执行每个方案。

系统中的功能可以相互构建。这并不意味着用于检查应用程序是否仍有效的方案应在执行期间相互构建。

不确定这是否是一种模式,但它可能是一个努力的方向。

总的来说,您希望查看关注点分离和单一责任原则。

在 Cucumber 级别有两个"责任层",测试脚本(功能文件 + 步骤实现)和被测系统的模型。 步骤实现直接映射到模型。 它的唯一用途是将功能步骤绑定到方法。模型实现是对受测系统的状态进行建模,其中包括状态持久性。 模型应该以声明式风格公开其接口,而不是命令式方法,以便我们看到fooPage.login();优先于page.click('login');

在Selenium WebDriver方面,使用页面对象模型正是这些可重用的对象理解表示页面的语义,并且将是第三层。

- 测试脚本(功能文件 + Java 步骤) - SUT模型(保持状态) - 页面对象模型 -> Web 驱动程序/浏览器

如前所述,尝试在数据方面将测试场景彼此隔离。

只有几种方法:

  1. 在执行每个测试方案之前清理数据库或还原原始数据都会成功;但是,这可能会大大减慢测试速度。如果清洁操作大约需要 10 秒,则 100 次测试需要 ~15 分钟,1000 次测试需要 ~3 小时。

  2. 或者,每个测试都可以生成和使用自己的数据。这里的问题是,许多测试实际上可以使用相同的数据,在这种情况下,一遍又一遍地创建这些数据是没有意义的,更不用说这也是需要时间的事情。

  3. 另一种选择是区分只读测试和读写测试。前者可以使用默认数据,因为它们不受数据依赖关系的影响。后者应处理特定数据,以避免与其他测试场景发生冲突。

不过,测试方案中的步骤定义可能取决于作为该测试方案的一部分执行的上一步定义的状态。因此,仍然需要以某种方式进行状态管理。模型中可能需要一些帮助程序对象。

请记住,Steps类是针对每个测试方案实例化的,以及从它们创建的对象。因此,私有实例属性将不起作用,除非测试方案使用的所有步骤都在同一 Steps 类中实现。否则,请考虑静态变量或尝试使用依赖注入框架。

最新更新