提问者:小点点

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       |

的步骤定义中,当用户做某事时,我想要一个地图,该地图将具有map{"Param Title":"value 1"}用于第一个示例,{"Param Title":"value 2","Param Title 2":"value 3"}用于第二个示例。在cucumber中有没有办法做到这一点,或者我唯一的选择是为每个示例多次编写相同的场景?


共2个答案

匿名用户

与尝试将映射传递到通用步骤定义所增加的复杂性相比,编写步骤定义的成本微不足道。

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

让我给你举几个例子

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

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

匿名用户

您可以像下面这样在特征文件中编写,其中Param标题定义为列

When user do something <Param Title>

在步骤定义中,您可以编写。通过这种方式,您不必一次又一次地编写场景,并且您可以将多个示例编写为一个示例集中的多行

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

}