首页 > 解决方案 > Cucumber 将整个示例传递给一个步骤

问题描述

我想将整个示例作为 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"}第二个示例提供地图。有没有办法在黄瓜中做到这一点,或者我唯一的选择是为每个示例多次编写相同的场景?

标签: javacucumberscenarios

解决方案


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

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

让我给你一些例子

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、login、admin_login)完成的,所以如果你有二十个步骤定义来登录并不重要,只要它们都使用辅助方法来完成你的工作没有真正的代码重复,并且您具有简单性和一致性。

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


推荐阅读