使用 rspec 处理数据驱动测试中的失败

Handling failures in data driven testing using rspec

我正在使用 rspec 进行一些数据驱动测试。我的测试从一个 csv 文件中读取,抓取一个条目,该条目被插入到页面上的文本框中,然后与同样从 csv 文件中读取的预期文本进行比较。所有这些都按预期工作,我能够毫无问题地阅读和比较。

下面是我的代码:

读取csv文件的方法:

   def user_data
      user_data = CSV.read Dir.pwd + '/user_data.csv'
      descriptor = user_data.shift
      descriptor = descriptor.map { |key| key.to_sym }
      user_data.map { |user| Hash[ descriptor.zip(user) ] }
    end

测试:

describe "Text box tests" do

  before :all do
    @homepage = Homepage.new
  end

  it "should display the correct name" do
    visit('http://my test url')
    sleep 2
    user_data.each do |entry|
      @homepage.enter_name(entry[:name])
      @homepage.click_go()
      sleep 2
      begin
        expect(page).to have_css("#firstname", text: entry[:expected_name])
      end
    end
  end
end

问题在于失败。如果其中一项测试失败(即预期的文本未显示在页面上),则测试将停止,并且不会测试 csv 中的所有后续条目。如果我在这样的 expect 语句之后进行救援:

   rescue Exception => error
     puts error.message

然后错误记录到控制台,但是在我的测试结束时 运行 它说没有失败。

所以基本上我要寻找的是,如果我的测试失败,则保持 运行ning(直到 csv 中的所有条目都被覆盖),但对于测试 运行 被标记为失败。有谁知道我怎么能做到这一点?

我建议映射条目并调用常规的水豚方法 has_css? 而不是 rspec 辅助方法。它看起来像这样:

results = user_data.map do |entry|
  @homepage.enter_name(entry[:name])
  @homepage.click_go()
  sleep 2
  page.has_css?("#firstname", text: entry[:expected_name])
end

expect(results.all?) to be_truthy

如果你想跟踪哪些失败了,你可以稍微修改一下:

missing_entries = []
user_data.each do |entry|
  @homepage.enter_name(entry[:name])
  @homepage.click_go()
  sleep 2
  has_entry = page.has_css?("#firstname", text: entry[:expected_name])
  unless has_entry
    missing_entries.push entry[:expected_name]
  end
end

expect(missing_entries).to be_empty

尝试这样的事情:

context "when the user is on some page" do
  before(:context) { visit('http://example.org/') }

  user_data.each do |entry|
    it "should display the correct name: #{entry[:name]}" do
      @homepage.enter_name(entry[:name])
      @homepage.click_go

      expect(page).to have_css("#firstname", text: entry[:expected_name])
    end
  end
end

您还需要将 def user_data 更改为 def self.user_data