黄瓜4:实施全局挂钩

时间:2019-07-10 07:40:23

标签: java cucumber-jvm

我是Cucumber BDD测试v4.1的新手。

问题:

  1. 如何在黄瓜4(DAO,春季)中实施before(setup)方法?

请帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

黄瓜挂钩-在哪里使用@Before @Before,它的最基本用法是允许您在每种情况之前运行一段代码。通常,在Cucumber中,我们倾向于进行与初始化相关的事情-例如,在Give语句中进行对象初始化,数据设置等。因此,很多人不认为需要使用Cucumber的@Before。但是您可以使用@Before在报表中的条目中输入正在执行新方案。由于@Before总是在每个方案之前运行,因此您可以在报表中使用它来清楚地描述方案何时开始执行。

不必在每个功能文件中添加@Before。只需将其添加到任何一个功能文件中,然后让Cucumber完成其工作即可。黄瓜将弄清楚您保存@Before的位置,然后它将在所有方案之前使用它。为了使您的报告更加有用和易于理解,您实际上还可以在报告中写下方案名称。下面给出了Java代码–

@Before
public void before(Scenario scenario) {
    System.out.println("------------------------------");
    System.out.println("Starting - " + scenario.getName());
    System.out.println("------------------------------");
}

Cucumber API提供了一个称为Scenario的接口,您可以使用该接口获取此类的实例。在上面的代码中,我们仅使用此接口的getName()方法在日志中打印方案名称。

单个场景的测试钩子(示例):

功能文件

Feature: Test Hooks

    Scenario: This scenario is to test hooks functionality
        Given this is the first step
        When this is the second step
        Then this is the third step

步骤定义:

package stepDefinition;

import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class Hooks_Steps {

 @Given("^this is the first step$")
 public void This_Is_The_First_Step(){
 System.out.println("This is the first step");
 }

 @When("^this is the second step$")
 public void This_Is_The_Second_Step(){
 System.out.println("This is the second step");
 }

 @Then("^this is the third step$")
 public void This_Is_The_Third_Step(){
 System.out.println("This is the third step");
 }

}

挂钩

package utilities;
import cucumber.api.java.After;
import cucumber.api.java.Before;

public class Hooks {

    @Before
    public void beforeScenario(){
        System.out.println("This will run before the Scenario");
    }   

    @After
    public void afterScenario(){
        System.out.println("This will run after the Scenario");
    }
}

编辑:

Issue #515和其他地方提到的解决方法是在运行器类中使用JUnit的@BeforeClass@AfterClass批注,如下所示:

@RunWith(Cucumber.class)
@Cucumber.Options(format = {
    "html:target/cucumber-html-report",
    "json-pretty:target/cucumber-json-report.json"})
public class HooksTest {

    @BeforeClass
    public static void setup() {
        System.out.println("Ran the before");
    }

    @AfterClass
    public static void teardown() {
        System.out.println("Ran the after");
    }
}

注意:尽管@BeforeClass@AfterClass乍看起来似乎是最干净的解决方案,但使用起来并不实用。仅当Cucumber-JVM设置为使用 JUnit运行器时,它们才起作用。其他运行程序,例如TestNG,命令行运行程序和特殊的IDE运行程序,都不会使用这些钩子。他们的方法还必须是静态的,并且无论如何都需要静态变量或单例来共享数据。

to run JUnit test cases from the command line

答案 1 :(得分:0)

我已经获得了实现ConcurrentEventListener的答案。