在ruby中重新运行失败的单元测试

时间:2012-02-08 17:43:18

标签: ruby unit-testing testunit

我有一些使用Test :: Unit :: TestCase编写的单元测试,使用ci_reporter生成的XML。但是,由于我无法控制的情况,它们可能偶尔会波动,并且会随机失败。我想检测测试何时失败,并尝试重新运行它。

我尝试通过猴子修补'拆除'检查'通过'来执行此操作,并在失败时重新运行测试。但是,XML输出仍将显示第一个失败的情况,而不是第二个(现在正在通过)运行。

1 个答案:

答案 0 :(得分:0)

这听起来有点像Multiple tests with minitest

的反面

也许这是一种可能性:将您的测试用例复制到自己的文件中。例如,尝试以下测试:

#store it as file 'testcase.rb'
gem 'test-unit'
require 'test/unit'

class X < Test::Unit::TestCase
  def test_1
    num = rand(10) 
    assert_true( num < 2, "Value is #{num}")
  end
end 

然后在rake任务中定义您的测试调用:

require 'rake'

TEST_REPETION = 10
task :test do
  success = false
  TEST_REPETION.times{
    stdout = `ruby testcase.rb`

    if stdout =~ /Failure/
      puts "Failure occured - redo the test"
    else
      puts 'Tests ok'
      success = true
      exit 
    end
  }

  puts "Stopped after #{TEST_REPETION} tries" unless success
end

现在调用测试,直到测试成功或TEST_REPETION完成。

说明:

  • 不需要Rake,你可以不用rake打电话(My template是一个佣金任务)
  • 这只适用于每次运行时xml的更改(必须在测试之前重新生成。否则测试总是相同的。)
  • 您可以将测试结果(stdout)存储在一个文件中,稍后再使用它来分析哪些测试失败并尝试重新测试。