Cucumber-JVM:在步骤定义

时间:2017-11-30 16:02:04

标签: java cucumber cucumber-java

我有一个步骤定义,我传递了一个场景或场景大纲的名称:

@When("^I execute the steps of the following scenario or scenario outline: \"([^\"]*)\"$")
public void execute_steps_of_the_scenario_or_scenario_outline(String name){
...
}

我的目的是执行被调用的Scenario / ScenarioOutline的所有步骤,并将这些已执行的步骤附加到当前场景。这意味着被调用场景的步骤成为当前场景的一部分。

但是我一直无法找到办法。

1 个答案:

答案 0 :(得分:1)

黄瓜(和一般的BDD / TDD)并不意味着像这样使用。每个场景/测试应该彼此隔离,并且不是从一个场景在另一场景中执行步骤的好方法。

您可以在功能上使用后台步骤来执行该功能的方案中的常用步骤,或者您也可以使用标记在使用Hook执行方案之前和/或之后执行特定的操作集。

话虽如此,您可以在粘合代码中编写一些逻辑来维护在每个场景中调用的步骤(方法)列表,并在后续场景中调用相同的步骤列表。这假设您可以保证场景的执行顺序,这(再次)针对所有TDD最佳实践。下面是一个实现我刚刚描述的骨架代码的例子。

private Scenario scenario;

private Map<String, List<String>> scenarioSteps = new HashMap<>();

@Before
public void setUp(Scenario scenario) {

    this.scenario = scenario;

    scenarioSteps.put(scenario.getName(), new LinkedList<>());
}

@Given("^the first step is executed$")
public void the_first_step_is_executed() {

    final StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[1];

    scenarioSteps.get(scenario.getName()).add(stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName());
}