如何从Cucumber-JVM中的另一个步骤调用一个步骤

时间:2014-03-27 18:52:55

标签: scala cucumber cucumber-jvm

在Cucumber(ruby版本)中,您可以轻松地call steps from other steps,从而构建分层的步骤库,使write the Gherkin feature specifications in the most generic terms变得容易。

然而,在Cucumber-JVM中如何做到这一点并不明显,我一直无法找到它的文档。

让我说清楚我对直接调用步骤实现函数不感兴趣,因为我不想知道它的签名是什么,也不是每次实现更改时都改变调用。

相反,我想传递一个任意字符串,它将通过正则表达式匹配器并自动找到匹配步骤并执行它。就像引擎运行所有步骤一样。

我期望语法看起来像定义同义词的简单示例" logout":

When("user logs out") { () =>
  d.executeScript("logout();")
}
When("logout") { () =>
  Step("user logs out")
}

4 个答案:

答案 0 :(得分:4)

Cucumber-JVM不支持此功能。 (请注意,您在问题中链接的Cucumber Backgrounder文档描述了使用步骤中的步骤"反模式")

基本上,我们认为Cucumber是一种协作工具,Gherkin不是一种编程语言。

您可以看到我们如何做出更长时间的讨论here

答案 1 :(得分:2)

要调用步骤定义中的步骤,请在java

中继承cuke4duke.Steps
import cuke4duke.StepMother;
import cuke4duke.Steps;
import cuke4duke.annotation.I18n.EN.When;

public class CallingSteps extends Steps {
    public CallingSteps(StepMother stepMother) {
        super(stepMother);
    }

    @When("^I call another step$")
    public void iCallAnotherStep() {
        Given("it is magic"); // This will call a step defined somewhere else.
    }
}

示例: https://github.com/cucumber-attic/cuke4duke/blob/master/examples/java/src/test/java/simple/CallingSteps.java

注意: cuke4duke支持scala

答案 2 :(得分:1)

在步骤中调用步骤是一个糟糕的反模式,可以很容易地用更简单的方法代替。

让两个步骤都调用相同的帮助方法,而不是一个步骤调用另一个步骤。

如果您严谨地应用此模式,并向上

  • 步骤定义都只是对辅助方法的单次调用
  • 一组辅助方法,可共同提供一个test-api

优雅地实现Cucumber方案的艺术现在成为一个已知的编程问题,因为您的所有功能现在都直接以您的编程语言编写在代码中,而不是处于特定于Cucumber的限制性结构中。

您现在可以

  • 重构您的助手方法以提供更清洁的界面
  • 使用参数赋予方法更大的力量
  • 使用命名使您的所有通话更加清晰
  • 使用帮助程序方法作为一系列附加功能的入口点
  • 使用委托将功能移出辅助方法并移入测试服务对象 ...

如果您不是程序员,或者对所使用的特定编程语言没有经验,那么提供这种分隔可能会非常困难。但是,一旦您克服了这一最初的障碍,您将可以并且应该生成的代码比步骤嵌套中不可避免地出现的混乱情况要容易得多。

答案 3 :(得分:0)

在黄瓜中,每个步骤都是一个方法。这样,您可以在所需的任何步骤中调用其他方法。

@When("^click on \"([^\"]*)\"$")
public void clickOn(String arg1) throws Throwable {
    driver.findElement(By.linkText(arg1)).click();
}


@Then("^should see the static elements changing$")
public void shouldSeeTheStaticElementsChanging() throws Throwable {
    clickOn(); 
}