Cucumber 将整个示例传递给一个步骤

Cucumber pass whole example to a step

我想将整个示例作为 Map 对象传递给某个测试步骤。如何实现?

假设我有场景

Scenario Outline: some description text
When user do something
Then the user should see something
Examples: set 1
  | Param Title |
  | value 1     |
Examples: set 2
  | Param Title | Param Title 2 |
  | value 2     | value 3       |

When user do something 的步骤定义中,我想要一个地图,第一个示例的地图为 {"Param Title":"value 1"},第二个示例的地图为 {"Param Title":"value 2","Param Title 2":"value 3"}。有没有办法在黄瓜中做到这一点,或者我唯一的选择是为每个示例多次编写相同的场景?

您可以在功能文件中像下面这样写,其中 Param Title 定义为 Column

When user do something <Param Title>

在步骤定义中,你可以写。这样一来,你就不用一遍又一遍地写场景了,可以把多个例子写成一个例子集中的多行

@When("user do something ([^\"]*)")
public void useractivity(String Title){

}

与您通过尝试将地图传递到通用步骤定义而增加的复杂性相比,编写步骤定义的成本微不足道。

如果您将所有步骤定义实现为对辅助方法的单次调用,那么如果您有很多执行相同操作的步骤定义,那真的没有关系。当您遵循此模式时,您的步骤定义执行一个功能,它们将字符串短语转换为方法调用。

让我举几个例子

Given I am logged in
Given I am logged in as an admin
Given Fred is logged in
Given Bill is logged in
Given Sam is logged in as an admin

现在您可能只想为所有这些编写一个步骤定义,但这实际上是一个错误和错误的优化。做下面的就简单多了(所有例子都在ruby)

Given 'I am logged in' do
  @i ||= create_user
  login as: @i
end

Given 'I am logged in as an admin' do
  @i ||= create_admin
  admin_login as: @i
end

Given 'Fred is logged in' do
  @fred ||= create_user(first_name: 'Fred')
  login as: @fred
end

Given 'Bill is logged in' do
  @bill ||= create_user(first_name: 'Bill')
  login as: @fred
end
  
Given 'Sam is logged in as an admin' do
  @sam ||= create_admin(first_name: 'Sam')
  login as: @sam
end

这里的所有工作都是由辅助方法(create_user、create_admin、登录、admin_login)完成的,所以如果你有二十个步骤定义也没关系只要他们都使用辅助方法来完成工作就可以登录,你没有真正的代码重复,而且你有简单性和一致性。

这是一种与您目前采用的方法完全不同的方法。但是,对于涉及使用步骤和步骤定义做复杂事情的任何 cuke 问题的有效答案是停止尝试做复杂的事情,而是做更简单的事情。