如何在cucumber中使用可选参数

问题描述 投票:0回答:8

我想要相同的 Gherkin 句子(带参数和不带参数):

小黄瓜参数:

When a 'notify' message is sent to the green box with the properties.
 |type|message|
 |error|The error message|

无参数的小黄瓜:

When a 'notify' message is sent to the green box with the properties.

Java(黄瓜):

@When("^a '(.*)' message is sent to the green box with the properties.$")
public void hello(String name, List<GherkinCondition> conditions) {
    ...
}

我有一个错误,因为 java 方法是用 2 个参数声明的,而在“没有参数”的情况下我只有一个。

堆栈跟踪:

cucumber.runtime.CucumberException: Arity mismatch: Step Definition 'steps.CommonSteps.hello(String,GherkinCondition>) in file:/C:/workspace/xxxxx/java/target/classes/' with pattern [^a '(.*)' message is sent to the green box with the properties.$] is declared with 2 parameters. However, the gherkin step has 1 arguments [notify]. 
java cucumber gherkin
8个回答
5
投票

Cucumber 步骤定义不支持可选参数。

您可以编写两个不同的步骤定义,也可以为第二种情况提供一个空数据表。

When a 'notify' message is sent to the green box with the properties.
 |type|message|

甚至

When a 'notify' message is sent to the green box with the properties.
     |||

2
投票

我这样做:

@Then("^Something is (not )?counted$")
public void somethingCounted(String optional) {
    //
}

正则表达式匹配“某些内容被计算”和“某些内容未被计算”

对于第一种情况,您将得到“not”值,对于第二种情况,您将得到 null。


1
投票

我创建一个 PR 来解决此问题:https://github.com/cucumber/cucumber-jvm/pull/1056

Gherkin 脚本测试:

@hello 
Feature: hello (Function to validate the environment.) 

    Scenario Outline: Function to validate the environment.
        Given me a hello, please. Best Regards '<author>'.
        Given me a hello, please. Best Regards '<author>'.
            |key|expected|actual|
        Given me a hello, please. Best Regards '<author>'.
            |key|expected|actual|
            |zip|35000|<zip>|
            |city|Rennes|<city>|

        Given me a bye, please. Best Regards '<author>'.
        Given me a bye, please. Best Regards '<author>'.
            |zip|<zip>|
            |city|<city>|

        Given me a cat, please. Best Regards '<author>'.

    Examples:
    #Begin Examples#
    |author|zip|city|
    |Jenkins Q1|35000|Rennes|
    |Jenkins Q2|35000|Rennes|
    #End Examples#

Java Cucumber代码:

    @Given("^me a hello, please. Best Regards '(.*)'.$")
    public void hello(String name, List<GherkinCondition> conditions) {
        int i = 0;
        for (GherkinCondition gherkinCondition : conditions) {
            i++;
            logger.info(String.format("  expected contition N°%d=%s", i, gherkinCondition.getExpected()));
            logger.info(String.format("  actual   contition N°%d=%s", i, gherkinCondition.getActual()));
        }
        logger.info("Hello " + name + "!");
    }

    @Given("^me a cat, please. Best Regards '(.*)'.$")
    public void hello(String name) {
        logger.info("Take my cat " + name + "!");
    }

    @Given("^me a bye, please. Best Regards '(.*)'.$")
    public void bye(String name, Map<String, String> params) {
        int i = 0;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            i++;
            logger.info(String.format("  Key N°%d: %s   Value:%s", i, entry.getKey(), entry.getValue()));
        }
        logger.info("Bye " + name + "!");
    }

0
投票

这对我有用。我可以通过 IND 或 USA。注意:如果您没有通过任何 IND,USA,这将不起作用。

@When("^I search (.*) (IND|USA)? in Database$")
public void searchInDatabase(String name, String country){
    if(country.equals("IND"))
        dbObj.searchDatabase(name, true);
    else if(country.equals("USA"))
        dbObj.searchDatabase(name, false);
    else
        dbObj.searchDatabase(name, true); 
}

0
投票

我得到了问题的答案:-

@When(“^我在(IND | USA)中搜索(.*)?数据库$”)

我正在寻找可选参数 USA 或 IND。上面的行解决了我的问题。 ( 和 |

后需要空格

0
投票

不能具体说明如何在Java中解决这个问题,但是当使用PHP时,我认为你可以通过将参数设置为NULL来实现你的目标,即:

想象一下您想要检查颜色,而您的小黄瓜会说:

Given I want to check colors "red" and "green"

你会有一个像这样的函数:

public function iCheckColors($arg1, $arg2) {
    // do stuff here;
}

那么您可能需要检查小黄瓜系列中的三种颜色,例如:

Given I want to check colors "red" and "green" and "blue"

在这种情况下,您需要将第三个参数添加到您的函数中:

public function iCheckColors($arg1, $arg2, $arg3) {
    // do stuff here;
}

这里的问题是,如果你再次使用第一个 Gherkin 行,你的函数会抛出一个错误,因为她需要第三个参数,但如果你将此参数设置为 NULL:

public function iCheckColors($arg1, $arg2, $arg3 = NULL) {
    // do stuff here;
}

然后添加到函数中的两条 Gherkin 行都应该可以工作。它仍然需要两个参数,如果您将第三个参数添加到 Gherkin 行,它会覆盖 NULL 值。

希望这就是您想要实现的目标。


0
投票

到目前为止,还没有解决方案;

替代文本仅在文本之间没有空格时才有效 替代零件。

因此,您使用 () -> 可选的方式是我们现在最好的方式。


0
投票

Regex 可以帮助您将可选参数从测试定义发送到步骤定义,请参阅下面的示例:

When(/^"([^"]*)" marks the trip arrived(?: at buyer "([^"]*)")?(?: with)?(?: (.*))*$/) do |user_type, buyer_name, table|
  params = table ? table.rows_hash : {}
  <rest of the code here>
end

然后您可以发送表中尽可能多的kv。

© www.soinside.com 2019 - 2024. All rights reserved.