使用 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
我正在使用 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