代码之家  ›  专栏  ›  技术社区  ›  Eric Hartford

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

  •  9
  • Eric Hartford  · 技术社区  · 10 年前

    在Cucumber(红宝石版本)中,您可以轻松 call steps from other steps 从而构建分层的步骤库 write the Gherkin feature specifications in the most generic terms .

    然而,在Cucumber JVM中如何做到这一点尚不清楚,我一直无法找到相关文档。

    让我明确一点,我对直接调用step实现函数不感兴趣,因为我不想知道它的签名是什么,也不想在每次实现更改时更改调用。

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

    我希望语法看起来像是定义同义词“logout”的简单示例:

    When("user logs out") { () =>
      d.executeScript("logout();")
    }
    When("logout") { () =>
      Step("user logs out")
    }
    
    4 回复  |  直到 10 年前
        1
  •  6
  •   Seb Rose    10 年前

    Cucumber JVM不支持此功能。(请注意,您在问题中链接的Cucumber Backgrounder文档将步骤中的步骤描述为“反模式”)

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

    你可以看到关于我们如何做出这一决定的更长的讨论 here

        2
  •  2
  •   Prashanth Sams    7 年前

    要在步骤定义中调用步骤,请继承 cuke4duke.Steps 在java中

    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

        3
  •  2
  •   diabolist    5 年前

    在步骤中调用步骤是一种可怕的反模式,很容易被更简单的方法取代。

    不要让一个步骤调用另一个步骤,而是让两个步骤调用同一个助手方法。

    如果你严格运用这种模式

    • 所有步骤定义都是对helper方法的单个调用
    • 一组帮助器方法,它们共同提供测试api

    优雅地实现Cucumber场景的艺术现在已经成为一个众所周知的编程问题,因为您的所有功能现在都直接在编程语言的代码中,而不是在Cucumber特有的限制性构造中。

    你现在可以了

    • 重构你的助手方法以提供更干净的交互
    • 使用参数赋予方法更大的权力
    • 使用命名使所有通话更加清晰
    • 使用helper方法作为一套额外功能的入口
    • 使用委托将功能从助手方法移到测试服务对象中 ...

    如果您不是程序员或对所使用的特定编程语言没有经验,那么提供这种分离最初可能会有挑战性。然而,一旦您克服了这一最初的障碍,您可以并且应该生成的代码将比步骤嵌套不可避免地出现的混乱更容易处理。

        4
  •  0
  •   drkvader    5 年前

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

    @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(); 
    }