java - 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"}
第二个示例提供地图。有没有办法在黄瓜中做到这一点,或者我唯一的选择是为每个示例多次编写相同的场景?
解决方案
与您通过尝试将地图传递到通用步骤定义中添加的复杂性相比,编写步骤定义的成本微不足道。
如果您将所有步骤定义实现为对辅助方法的单个调用,那么您是否有很多执行相同操作的步骤定义并不重要。当您遵循此模式时,您的步骤定义执行一个功能,它们将字符串短语转换为方法调用。
让我给你一些例子
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)完成的,所以如果你有二十个步骤定义来登录并不重要,只要它们都使用辅助方法来完成你的工作没有真正的代码重复,并且您具有简单性和一致性。
这与您当前采用的方法完全不同。但是,对于任何涉及使用步骤和步骤定义做复杂事情的问题,一个有效的答案是停止尝试做复杂的事情,而是做更简单的事情。
推荐阅读
- apache-storm - 控制 Apache Storm 中的调度/放置
- python - 从列表列表中消除重复项
- r - 在 R 中转换为 Edgelist 时保留顶点名称
- javascript - 如何通过 textContent 插入标签或 JS 脚本?
- c++ - 在 QT -c++ 中始终检查 Qcheckbox 最少一个选项
- mysql - MySql Select 语句(其他公司)
- javascript - 未捕获的 TypeError:this.props.fetchResults 不是函数
- apache - Apache SSL vhost 不会使用 DocumentRoot,而是使用服务器 webroot
- apache-flink - 我从一个 1.8GB 的保存点恢复我的工作,然后立即创建一个新的保存点,这个保存点的大小约为 50MB。我的国家去哪儿了?
- shell - 使用 awk 和 bash 用行号拆分逗号分隔列表