2012-05-11 15 views
6

tengo 4 pruebas en una secuencia de comandos de rubí, que corro utilizando comandosejecutar varias pruebas en una secuencia de comandos en paralelo usando Test Unit Rubí

ruby test.rb 

la puesta fuera parece

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 

Lo que quiero lograr es, ejecutar todas las 4 pruebas en paralelo en lugar de ser secuenciales. Algo así como 4 subprocesos cada uno ejecutando una prueba, reduciendo efectivamente el tiempo de ejecución a la más lenta de las 4 pruebas + poco tiempo de la ejecución paralela.

Me encontré con this, pero esto parece ejecutar varios archivos de prueba de ruby ​​en paralelo - digamos si tuviera test1.rb, test2.rb test3.rb, entonces los tres archivos se ejecutarían en paralelo.

Cualquier ayuda será apreciada.

+0

Puedo confirmar que parallel_tests funciona en el nivel de archivo, que no es lo que quiere aquí, pero es muy bueno en lo que hace. – x1a4

Respuesta

1

que intentaron una combinación de TestSuite y Thread:

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)} 

Se ve bien, pero no hice las pruebas de referencia.

La salida (ver abajo) es un poco caótica, cada hilo está publicando sus mensajes en el mensaje de otros hilos, pero parece funcionar correctamente. Así que tal vez deba capturar la salida de cada hilo para obtener mejores registros de prueba.

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 
+0

Vea también http://stackoverflow.com/questions/56087/does-ruby-have-real-multithreading para hilos en ruby. – knut

+0

gracias por su respuesta detallada. Parece que funcionaría, aunque todavía estoy atascado con este error. '/opt/local/lib/ruby/gems/1.8/gems/rake-0.9.2/lib/rake/ext/module.rb:36:in' const_missing ': constante no inicializada MyTest (NameError) ' – Amey

+0

No importa que ! ¡Esto es súper fantástico! :) Muchas gracias – Amey

0

Se supone que es posible ejecutar pruebas en paralelo en Ruby 1.9.3, pero aún no lo he hecho funcionar.

0
gem install parallel_tests 

parallel_test a_test.rb b_test.rb 
+0

Esto requiere que las pruebas estén en diferentes archivos –

Cuestiones relacionadas