2014-01-06 46 views
1

我们正试图将CSV到黄瓜获得的CSV文件的好处,但网上调查,当我看到这个功能,但只有“Import scenario outline 'examples' from CSV?”没有正式的文件。导入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`映射到数\日期在功能文件?

回答

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/,这可能是您的灵感项目。