使用rspec处理数据驱动测试中的故障

时间:2018-02-22 17:04:27

标签: ruby selenium rspec capybara

我正在使用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中的所有后续条目。如果我按照这样的期望声明进行救援:

   rescue Exception => error
     puts error.message

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

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

2 个答案:

答案 0 :(得分:1)

我建议映射条目并调用常规的capybara方法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

答案 1 :(得分:1)

尝试这样的事情:

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