在Cucumber中导入CSV作为测试数据?

时间:2014-01-06 17:11:47

标签: ruby cucumber

我们正在尝试将CS​​V合并到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`映射到要素文件中的数字\日期?

1 个答案:

答案 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/的目标,可能是一个灵感项目。