在场景之间共享状态

不要这样做。

场景必须相互独立,因此状态不应在场景之间共享非常重要。意外地将状态从一个场景泄漏到另一个场景会使您的场景变得脆弱,并且难以隔离运行。

为了防止意外地在场景之间泄漏状态

  • 避免使用全局或静态变量。
  • 确保您在Before钩子中清理数据库。
  • 如果在场景之间共享浏览器,请在Before钩子中删除 cookie。

在步骤之间共享状态

在您的场景中,您可能希望在步骤之间共享状态。

可以在步骤定义中的变量中存储状态。

小心状态

状态会使您的步骤耦合更紧密,并且更难重用。

依赖注入

PicoContainer

Spring

Guice

OpenEJB

Weld

Needle

如何使用 DI

使用自定义注入器

黄瓜对象工厂

从命令行使用 Cucumber 对象工厂

在属性文件中使用 Cucumber 对象工厂

使用 Cucumber 对象工厂与测试运行器(JUnit 5/JUnit 4/TestNG)

事件总线

配置 UUID 生成器

定义自己的 UUID 生成器

数据库

有几种选项可以从数据库中删除状态,以防止状态在场景之间泄漏。

Before 钩子方法

在场景之间清理数据库的推荐方法是使用 Before 钩子 在场景开始之前删除所有数据。这通常比使用 After 钩子 更好,因为它允许您在场景失败时对数据库进行事后检查。

另一种方法是使用数据库事务。

数据库事务方法

如果您的数据库支持,可以在每个场景周围包装一个事务。

这可能会导致场景运行速度更快,但它也有一定的代价。您将无法进行事后检查,也无法使用 浏览器自动化

要使用此方法,您需要告诉 Cucumber 在 Before钩子 中启动事务,并在 After钩子 中回滚事务。

这是一种非常常见的做法,以至于许多 Cucumber 扩展提供了使用名为 @txn 的标签的现成的 条件钩子

要启用它,您必须使用 @txn 标签标记每个需要事务的 功能场景

@txn
Feature: Let's write a lot of stuff to the DB

  Scenario: I clean up after myself
    Given I write to the DB

  Scenario: And so do I!
    Given I write to the DB

使用 JUnit 5 和 Spring

浏览器自动化和事务

如果您使用的是通过 HTTP 与您的应用程序进行通信的 浏览器自动化 工具,如果您的 步骤定义 和服务 HTTP 请求的 Web 应用程序各自拥有自己的数据库连接,则事务方法将无法正常工作。使用事务时,事务永远不会提交到数据库(但在每个场景结束时回滚)。因此,Web 服务器的连接将永远看不到来自 Cucumber 的数据,因此您的浏览器也看不到。同样,Cucumber 的连接也看不到来自 Web 服务器的数据。

在这种情况下,您将不得不关闭数据库事务,并确保在每个场景之前明确删除测试数据。

关闭事务

清理您的数据库

您可以帮助我们改进此文档。 编辑此页面.