【问题标题】:How to use java switch statements in cucumber step definitions?如何在黄瓜步骤定义中使用 java switch 语句?
【发布时间】:2018-03-20 15:26:22
【问题描述】:

我有一个功能文件和相应的步骤定义,并且都按预期工作。现在,在相同的项目结构中,我创建了第二个功能文件。甚至在为新文件创建步骤定义之前,黄瓜告诉我新文件中的一个步骤存在匹配的步骤定义,当然,原因是该步骤的措辞与第一个功能中的步骤相同,因此 cucumber 拒绝为该步骤自动生成步骤 def,前提是已经存在实现。这两个步骤共享相同的正则表达式(捕获组),但正则表达式代表不同的 URL 参数

我现在的问题是如何重用现有的步骤定义。我读到可以使用 java switch 语句,以便 step def 可以用来表示两个功能步骤,但作者没有详细说明如何实现。

功能文件 1:

Scenario: Open shipping page
    When I select a course
    And I navigate to the shipping app
    Then the "shipping page" should open

步骤定义:

@Then("^the \"([^\"]*)\" should open$") . //matching step def
  public void verifyShippingPage(String shippingPage) {
  shipping.verifyShippingPage(shippingPage);  //method call

  }

功能文件 2:

Scenario: Open planet page
    When I select a course
    And I navigate to the planet app
    Then the "planet page" should open   //step that wants to reuse the step def above

运输页面和行星页面具有不同的 URL,但共享相同的正则表达式 \"([^\"]*)\"。是否可以使用 switch 语句在 URL 之间进行更改,或者有什么方法可以完成此任务?

【问题讨论】:

    标签: java cucumber


    【解决方案1】:

    是的,您可以使用 switch 语句。 ,例如这样:

    @Then("^the \"([^\"]*)\" should open$")
    public void verifyOnExpectedPage(String expectedPage) {
        switch (expectedPage) {
           case "shipping page":
              verifyShippingPage();
              break;  
           case "otherpage":  
              verifyOtherPage();
              break;
      }
    

    我会推荐两件事: 1. 当此步骤与未在 switch 语句中定义的页面一起使用时,使用默认值 2. 为了更清楚哪些选项可用,请使用(shipping page|other page) 之类的捕获组,而不是正则表达式。 在这种情况下,它只会匹配属于捕获组的页面,当您使用尚未(尚未)定义的页面时,会在您的功能文件中显示出来。

    所以它会更像这样:

    @Then("^the (shipping page|other page) should open$")
    public void verifyOnExpectedPage(String expectedPage) {
        switch (expectedPage) {
           case "shipping page":
              verifyShippingPage();
              break;  
           case "otherpage":  
              verifyOtherPage();
              break;
           default:
               System.out.println("Unexpected page type");  
      }
    

    最后,另一种选择是为每页声明单独的步骤定义,如下所示:

    @Then("^the shipping page should open$")
    public void verifyShippingPage() {
         verifyShippingPage();
    }
    
    @Then("^the other page should open$")
    public void verifyOtherPage() {
         verifyOtherPage();
    }
    

    【讨论】:

    • 我会推荐使用两个步骤的最后一种方法。它为您提供了更简单的映射(正则表达式更易于阅读)并且代码更易于阅读和理解。
    • @ThomasSundberg 是的,如果只有两个步骤,我也建议这样做。但是,在不同的情况下,我可能更喜欢另一种方法,即如果我们将来可能会添加更多页面并希望在一个地方保留所有选项的概述(因为 StepDefinition 文件往往会随着时间的推移变得很大并且令人困惑)。或者对有限的选项集有一个概述,并带有错误消息说我们期望以下选项之一。与往常一样,这取决于 ;)
    • 干得好,@Marit。我打算使用最后一种方法作为最后的手段。我想要一些更健壮和灵活的东西,所以早期的方法看起来像我正在寻找的东西。让我快速尝试一下,看看它对我有用。谢谢。为各种建议 +1
    • @Marit,此行会引发错误。 switch (expectedPage) { //不兼容的类型。找到 String,必填:byte、char、short 或 int。任何想法为什么?
    • @Theman 不,不确定。这个对我有用。你能粘贴你的完整方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多