当前位置: 首页 > 面试题库 >

如何在Cucumber JVM步骤之间传递变量

伊光赫
2023-03-14
问题内容

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

下面是一个示例,如下所示:

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

问题答案:

为了在步骤之间共享共同点,您需要使用World。在Java中,它没有在Ruby中那么清晰。

引用黄瓜的创建者。

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

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

  2. 在场景中的步骤定义和挂钩之间共享数据。

具体实现方式是特定于语言的。例如,在ruby中,self步骤定义中的隐式变量指向当前场景的World对象。默认情况下,这是Object的实例,但是如果您使用World钩子,则可以是您想要的任何对象。

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

与Cucumber-Java中的World等效的是 所有带有hook或stepdef注释的对象 。换句话说,任何带有@ Before,@
After,@ Given等方法的类的实例对于每种情况都将被实例化一次。

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

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

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

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

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

[2] PicoContainer,Spring,Guice,Weld,OpenEJB,Needle

可用的依赖注入模块为:

  • Cucumber skin container

  • Fresh Cucumber Juice

  • Cucumber openejb

  • Cucumber spring

  • Cucumber welding

  • Cucumber needle

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

希望这可以帮助。



 类似资料:
  • 我有一个变量,我想在所有步骤中传递这个变量。任何人都可以通过代码片段示例建议如何在步骤之间传递变量值。任何帮助将不胜感激。

  • 我得到了这个错误: “变量'a'已赋值,但其值永远不可用”

  • 问题内容: 假设我有以下情况; 在重新标记的页面中,有一个链接将页面/ a定向到/ b。我尝试将变量a传递给页面/ b以重用它。我该怎么做这个Flask应用程序?我需要使用会话还是有其他解决方案? 问题答案: 如果要传递一些不需要用户查看或控制的python值,则可以使用会话: 会话的行为就像字典,并序列化为JSON。因此,你可以将可序列化JSON的任何内容放入会话中。但是,请注意,大多数浏览器不

  • 问题内容: 我有两个Angular控制器: 我无法使用内部,因为它是未定义的。但是,如果我尝试像这样传递它… 我得到一个错误。有谁知道如何做到这一点? 在做 也失败。 注意: 这些控制器彼此之间不嵌套。 问题答案: 在多个控制器之间共享变量的一种方法是创建服务并将其注入到要使用它的任何控制器中。 简单服务示例: 在控制器中使用服务: 这个博客对此进行了很好的描述(特别是第2课)。 我发现,如果要跨

  • 问题内容: 我在jenkins有两个工作,这两个工作都需要相同的参数。 如何使用参数运行第一个作业,以便在触发第二个作业时使用相同的参数? 问题答案: 您可以使用参数化触发器插件,该插件可让您将参数从一个任务传递到另一任务。 您还需要在上游添加从上游传递的此参数。