我是Cucumber BDD测试v4.1的新手。
问题:
请帮助。谢谢。
答案 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运行程序,都不会使用这些钩子。他们的方法还必须是静态的,并且无论如何都需要静态变量或单例来共享数据。
答案 1 :(得分:0)
我已经获得了实现ConcurrentEventListener的答案。