我们正在尝试将CSV合并到Cucumber中以获得CSV文件的好处,但在线研究时,我看不到有关此功能的官方文档,只有“Import scenario outline 'examples' from CSV?”。
我不确定这是否会得出任何结论。目前在Cucumber中使用CSV的内置方式是什么?
如果目前没有内置方式导入CSV,我必须编写自己的解析方法,我想我的问题是,在步骤定义中,如何将变量与方案中的定义连接起来?例如:
Scenario: do something
Given I eat number as <number> cucumbers
and the cucumber is produced at date as <date>
When the cucumber is expired
Then I should have diarrhea
data.csv
number,date
1,2012-01-01
1,2012-11-03
在steps.rb中,如果我这样做:
CSV.foreach("path/to/data.csv") do |row|
...
如何将row.number
`row.date`映射到要素文件中的数字\日期?
答案 0 :(得分:3)
为了在黄瓜中使用示例功能,我认为你必须做一些重要的元编程,这可能会降低你的功能的可维护性和可读性。我可能通过将当前步骤包装在另一个步骤定义中来完成此操作:
Scenario: do something
Given I load some data
Then expired cucumbers should give me diarrhea
并定义步骤定义
Then 'I load some data' do
@data = []
CSV.foreach("path/to/data.csv", headers: true) do |row|
@data << row
end
end
Then 'expired cucumbers should give me diarrhea' do
@data.each do |row|
step %Q|I eat number as #{row[:number]} cucumbers|
step %Q|the cucumber is produced at date as #{row[:date]}|
step %Q|the cucumber is expired|
setp %Q|I should have diarrhea|
end
end
唯一的问题是,如果一个场景失败,可能需要额外的调试步骤来确定哪个失败。由于这些步骤或多或少地在引擎盖下运行。您可以通过从步骤定义中将行打印到STDOUT来轻松完成此操作:
Then 'expired cucumbers should give me diarrhea' do
@data.each do |row|
puts "row", row.inspect
step %Q|I eat number as #{row[:number]} cucumbers|
step %Q|the cucumber is produced at date as #{row[:date]}|
step %Q|the cucumber is expired|
setp %Q|I should have diarrhea|
end
end
这应该可以告诉你哪一行给你带来麻烦。
Erata:我理解您希望能够将数据表与功能分开,以便像项目经理这样的人能够提出边缘案例,然后让这些案例违背代码的行为。但我几乎更愿意允许他们在github上编辑该功能,并允许CI运行他们添加到示例表中的那些示例,而不是采用这种方法。在任何一种情况下,它可能对回归有利,但可能真的很难开发代码。这种类型的测试是http://fitnesse.org/的目标,可能是一个灵感项目。