2011-07-20 14 views
11

Al usar el marco integrado Ruby Minitest, ¿hay alguna forma de ejecutar algún código una vez antes de que se ejecute todo el paquete, o incluso una vez antes de que se ejecute todo TestClass? Veo en la respuesta al this question que Test :: Unit :: after_tests se puede usar para ejecutar código después de que se hayan ejecutado todas las pruebas; ¿Hay algún método similar para ejecutar código antes de que se hayan ejecutado todas las pruebas?Ruby Minitest: ¿Configuración de nivel Suite o Clase?

Me gustaría utilizar esta funcionalidad para inicializar una base de datos de prueba antes de ejecutar las pruebas y derribarla después de que se hayan ejecutado todas.

Gracias!

Respuesta

16

Esto se ha modificado a partir de MiniTest docs (en Tipos de corredores de prueba personalizables).

class Burger 
    def initialize 
    puts "YOU CREATED A BURGER" 
    end 

    def has_cheese? 
    true 
    end 

    def has_pickle? 
    false 
    end 
end 

gem 'minitest' 

require 'minitest/unit' 
MiniTest::Unit.autorun 

class MyMiniTest 
    class Unit < MiniTest::Unit 

    def before_suites 
     # code to run before the first test 
     p "Before everything" 
    end 

    def after_suites 
     # code to run after the last test 
     p "After everything" 
    end 

    def _run_suites(suites, type) 
     begin 
     before_suites 
     super(suites, type) 
     ensure 
     after_suites 
     end 
    end 

    def _run_suite(suite, type) 
     begin 
     suite.before_suite if suite.respond_to?(:before_suite) 
     super(suite, type) 
     ensure 
     suite.after_suite if suite.respond_to?(:after_suite) 
     end 
    end 

    end 
end 

MiniTest::Unit.runner = MyMiniTest::Unit.new 

class BurgerTest < MiniTest::Unit::TestCase 

    def self.before_suite 
    p "hi" 
    end 

    def self.after_suite 
    p "bye" 
    end 

    def setup 
    @burger = Burger.new 
    end 

    def test_has_cheese 
    assert_equal true, @burger.has_cheese? 
    end 

    def test_has_pickle 
    assert_equal false, @burger.has_pickle? 
    end 

end 

Tenga en cuenta que he incluido utilizar la gema en lugar de la versión incluida, que no tienen el método MiniTest::Unit.runner. Aquí está la salida.

Run options: --seed 49053 

# Running tests: 

"Before everything" 
"hi" 
YOU CREATED A BURGER 
.YOU CREATED A BURGER 
."bye" 
"After everything" 


Finished tests in 0.000662s, 3021.1480 tests/s, 3021.1480 assertions/s. 

2 tests, 2 assertions, 0 failures, 0 errors, 0 skips 

Por lo tanto, las llamadas #setup dos veces, pero .before_suite y .after_suite sólo una vez, que es lo que busca que pienso.

+0

D'oh! Completamente perdido en los documentos. ¡Gracias! –

+3

desafortunadamente en la versión 5 se eliminó el corredor ... Supongo que explica por qué minitest tiene tantas horquillas, solo necesitas repararlo antes de que funcione ... – nus

0

Una forma alternativa de conseguir una manija en el tiempo antes y después de todas las pruebas en una suite Minitest han corrido es poner if bloques en los setup & teardown métodos para controlar que estos bloques sólo se les llama una vez.

De esta manera, puede cargar un navegador y otras dependencias como objetos de página una sola vez al comienzo de su conjunto de pruebas y luego cerrar el navegador al final cuando se hayan completado todas las pruebas.

He aquí un ejemplo de esto usando Minitest 5.5.1 y Watir:

class CoolTests < Minitest::Test 

    @@setupComplete = false # tracks whether 1-time setup has completed, so we only instantiate a browser and dependent pages/modules one time per suite run 
    @@testsRun  = 0  # tracks how many tests have run so we can close the browser when all tests complete 

    def setup             # Minitest#setup runs before every #test method 
    @@testsRun+=1            # increment tetsRun indicating that a test has run 
    if ([email protected]@setupComplete)          # we load the browser and necessary page objects here one-time if we haven't already 
     @@driver = Watir::Browser.new :chrome     # instantiate new chrome browser 
     @@driver.window.maximize        # maximize the browser window so we expect to test against Desktop UI/UX rather than Mobile UI/UX 
     @@setupComplete = true         # setupComplete is now true as we've loaded up everything we need for our tests 
    end 
    end 

    def teardown             # Minitest#teardown runs after every #test method 
    if (@@testsRun == CoolTests.runnable_methods.length) # if we've run all the tests in the suite we are finished and can then close the browser 
     @@driver.quit 
    end 
    end 

    #Tests 

    def test_one 
    p __method__ 
    @@driver.goto('www.google.com') 
    assert_equal 'Google', @@driver.title, 'browser should be at google.com' 
    end 

    def test_two 
    p __method__ 
    @@driver.goto('www.bing.com') 
    assert_equal 'Bing', @@driver.title, 'browser should be at bing.com' 
    end 
Cuestiones relacionadas