如何在 cucumber-jvm 步骤之间传递变量

2022-08-31 17:17:25

为了在步骤之间传递变量,我让步骤方法属于同一类,并使用该类的字段作为传递的信息。

下面是一个示例:

Feature: Demo

  Scenario: Create user
    Given User creation form management
    When Create user with name "TEST"
    Then User is created successfully

包含步骤定义的 Java 类:

public class CreateUserSteps {

   private String userName;

   @Given("^User creation form management$")
   public void User_creation_form_management() throws Throwable {
      // ...
   }

   @When("^Create user with name \"([^\"]*)\"$")
   public void Create_user_with_name(String userName) throws Throwable {
      //...
      this.userName = userName;
   }

   @Then("^User is created successfully$")
   public void User_is_created_successfully() throws Throwable {
      // Assert if exists an user with name equals to this.userName
   }

我的问题是,在步骤之间共享信息是否是一种好的做法?或者最好将功能定义为:

Then User with name "TEST" is created successfully

答案 1

为了在步骤之间共享共性,您需要使用世界。在Java中,它不像Ruby中那样清晰。

引用黄瓜的创造者的话。

“世界”的目的是双重的:

  1. 隔离方案之间的状态。

  2. 在方案内的步骤定义和挂钩之间共享数据。

如何实现这是特定于语言的。例如,在 ruby 中,步骤定义中的隐式变量指向当前方案的 World 对象。默认情况下,这是 Object 的一个实例,但如果您使用 World 挂钩,它可以是您想要的任何内容。self

在Java中,您有许多(可能连接的)World对象。

Cucumber-Java中的世界等效物是所有带有钩子或阶梯注释的对象。换句话说,任何具有用 @Before、@After、@Given 等注释的方法的类将针对每个方案仅实例化一次。

这实现了第一个目标。要实现第二个目标,您有两种方法:

a) 对所有步骤定义和挂钩使用单个类

b) 使用按职责划分的几个类 [1],并使用依赖注入 [2] 将它们相互连接。

选项a)很快就会崩溃,因为您的步骤定义代码变得一团糟。这就是为什么人们倾向于使用b)。

[1] https://cucumber.io/docs/gherkin/step-organization/

[2] 微型容器,弹簧,圭斯,焊接,开放式EJB,针

可用的依赖关系注入模块包括:

  • 黄瓜-微型容器
  • 黄瓜
  • 黄瓜-开胃菜
  • 黄瓜泉
  • 黄瓜焊缝
  • 黄瓜针

原始帖子在这里 https://groups.google.com/forum/#!topic/cukes/8ugcVreXP0Y

希望这有帮助。


答案 2

使用实例变量在类中定义的步骤之间共享数据是可以的。如果您需要在不同类别的步骤之间共享数据,则应查看DI集成(PicoContainer是最简单的)。

在你展示的示例中,我会问在场景中显示“TEST”是否有必要。用户称为 TEST 的事实是一个偶然的细节,使方案的可读性降低。为什么不在Create_user_with_name()中生成一个随机名称(或硬编码)?


推荐