具有众多参数的黄瓜步骤

Cucumber step with numerous parameters

有没有办法将参数组合成一个参数,例如传递一个产生所有这些的数据结构?

例如我想避免使用带有太多参数的方法:

Scenario Outline: My scenario has too many parameters
    When I perform my request with these inputs: <param1>, <param2>, <param3>, <param4>, <param5>, <param6>, <param7>, <param8>, <param9>, <param10>, <param11>
 Examples:
  | param1 | param2 | param3 | param4 | param5 | param6 | param7 | param8 | param9 | param10 | param11 |
  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy   | dummy   |
  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy   | dummy   |

然后是方法:

@Given("^When I perform my request with these inputs: (.+), (.+), (.+), (.+), (.+), (.+), (.+), (.+), (.+), (.+), (.+)$")
public void tooMany(String param1, String param2, String param3, String param4, String param5, String param6, String param7, String param8, String param9, String param10, String param11)  {
...

是否有更好的方法来传输这么多输入?

谢谢

在您的步骤中使用数据 table 可以帮助组织这些信息:

Scenario Outline: My scenario has too many parameters
  When I perform my request with the following inputs:
    | Field   | Value     |
    | param1  | <param1>  |
    | param2  | <param2>  |
    | param3  | <param3>  |
    | param4  | <param4>  |
    | param5  | <param5>  |
    | param6  | <param6>  |
    | param7  | <param7>  |
    | param8  | <param8>  |
    | param9  | <param9>  |
    | param10 | <param10> |
    | param11 | <param11> |

Examples:
  | param1 | param2 | param3 | param4 | param5 | param6 | param7 | param8 | param9 | param10 | param11 |
  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy   | dummy   |
  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy  | dummy   | dummy   |

您的步骤定义变为:

@When("When I perform my request with the following inputs:")
public void notTooManyAnymore(DataTable table) {
    // Use table to get the params
}

现在您可以从 table 中提取参数(参见 Data Tables in Cucumber and Cucumber Data Tables)。您应该能够将 table 映射到 POJO 以确保编译时安全。

更好的方法是将所有这些示例从功能中取出,并将它们下推到步骤定义调用的辅助方法中。

示例 table 中的每组示例都应该有含义(否则它们为什么会出现在第一位!)。您可以使用此均值来确定捕获特定参数组合的名称。然后,您可以在场景中使用该名称来替换参数。

希望你能应付我在这里使用 foo、bar 和 request 作为名称,你的示例没有足够重要的东西来提取更好的名称。

接下来我们会

Scenario: Make a foo request
  When I perform a foo request

和此的 ruby 实现(您必须自己翻译成 java)将是

module RequestStepHelper
  def foo_example_params
    {
      param1: dummy,
      param2: dummy,
      ...
    }
  end

  def perform_request(params : {})
    # process hash to make correct call
    ...
  end
end
World RequestStepHelper

When 'I perform a foo request' do
  perform_request(foo_example_params)
end

所以现在已经从您的功能文件中删除了所有垃圾,现在可以专注于描述正在发生的事情以及为什么它很重要。此外,所有参数的处理现在都在代码中完成,您可以使用更多的功能,并且可以做一些事情,比如获取一组现有的参数并修改它们,例如foo_example_params.except(param1).