【问题标题】:Run multiple tests in one script in parallel using Ruby Test Unit使用 Ruby 测试单元在一个脚本中并行运行多个测试
【发布时间】:2012-05-11 17:56:24
【问题描述】:

我在一个使用命令运行的 ruby​​ 脚本中有 4 个测试

ruby test.rb

输出看起来像

Loaded suite test
Started
....

Finished in 50.326546 seconds.

4 tests, 5 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed

我想要实现的是,并行运行所有 4 个测试,而不是按顺序运行。 像 4 个线程每个运行一个测试,有效地将执行时间减少到 4 个测试中最慢的一个 + 并行执行的时间很少。

我遇到了this,但这似乎并行运行多个 ruby​​ 测试文件 - 假设我有 test1.rb、test2.rb test3.rb,那么所有三个文件将并行运行。

任何帮助将不胜感激。

【问题讨论】:

  • 我可以确认 parallel_tests 在文件级别工作,这不是您想要的,但它非常擅长它的作用。

标签: ruby unit-testing parallel-processing testunit


【解决方案1】:

我尝试了TestSuiteThread 的组合:

gem 'test-unit'
require 'test/unit'
require 'test/unit/ui/console/testrunner'
# we're running the tests, so we don't want Test::Unit to automatically run everything for us.  See http://www.natontesting.com/2009/07/21/stop-rubys-testunit-suite-files-running-all-your-tests/
Test::Unit.run = true


class MyTest < Test::Unit::TestCase
  def test_1()
    assert_equal( 2, 1+1)
  end
  def test_2()  
    assert_equal( 2, 4/2)
  end
  def test_3()      
    assert_equal( 1, 3/2)
  end
  def test_4()  
    assert_equal( 1.5, 3/2.0)
  end
end

#create TestSuites.
test_1 = Test::Unit::TestSuite.new("Test 1")
test_1 << MyTest.new('test_1')
#Same a bit shorter
test_2 = Test::Unit::TestSuite.new("Test 2") << MyTest.new('test_2')
test_3 = Test::Unit::TestSuite.new("Test 3") << MyTest.new('test_3')
test_4 = Test::Unit::TestSuite.new("Test 4") << MyTest.new('test_4')


#run the suites
Thread.new{Test::Unit::UI::Console::TestRunner.run(test_1)}
Thread.new{Test::Unit::UI::Console::TestRunner.run(test_2)}
Thread.new{Test::Unit::UI::Console::TestRunner.run(test_3)}
Thread.new{Test::Unit::UI::Console::TestRunner.run(test_4)}

看起来不错,但我没有进行基准测试。

输出(见下文)有点混乱,每个线程都将他的消息发布到其他线程的消息中,但它似乎工作正常。 所以也许你必须捕获每个线程的输出以获得更好的测试日志。

Loaded suite Test 4Loaded suite Test 1Loaded suite Test 2Loaded suite Test 3
Started
Started
.
Started
.
Started

.
.
Finished in 0.328125 seconds.

Finished in 0.328125 seconds.




1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
Finished in 0.765625 seconds.
Finished in 0.546875 seconds.
100% passed
1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications



3.05 tests/s, 3.05 assertions/s
100% passed
1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications

3.05 tests/s, 3.05 assertions/s

100% passed
100% passed

【讨论】:

  • 另请参阅stackoverflow.com/questions/56087/… 以了解 ruby​​ 中的线程。
  • 感谢您的详细回复。这似乎可行,但我仍然遇到这个错误。 /opt/local/lib/ruby/gems/1.8/gems/rake-0.9.2/lib/rake/ext/module.rb:36:in const_missing': 未初始化的常量 MyTest (NameError)`
【解决方案2】:

据说可以在 Ruby 1.9.3 中并行运行测试,但我还没有让它工作。

【讨论】:

    【解决方案3】:
    gem install parallel_tests
    
    parallel_test a_test.rb b_test.rb
    

    【讨论】:

    • 这要求测试在不同的文件中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多