2012-03-23 13 views

Respuesta

8

Si estás en 1.9, no utilice Test :: Unit :: TestCase como su clase base. Subclase, y anular #run_test para rescatar, para capturar la pantalla y volver a subir:

class MyAbstractTestCase < Test::Unit::TestCase 
    def run_test(*args) 
    super(*args) 
    rescue 
    snapshot() 
    raise 
    end 
end 

alternativa, y creo que esto es en realidad la forma más concisa, puede utilizar un gancho before_teardown:

class MyTestCase < Test::Unit::TestCase 
    add_teardown_hook do |tc| 
    screenshot() unless tc.passed? 
    end 
end 

Esto no funcionará en la prueba/unidad de 1.8, pero lo hará con la minitest en 1.9.

3

Bueno, podría ampliar Test::Unit::Assertions para hacer lo que quiera, no creo que haya una forma integrada de hacerlo. Tal vez algo como esto (rápida & sucio):

require 'test/unit' 

module Test::Unit::Assertions 
    def safe_assert(test, msg=nil) 
    passed = msg.nil? ? assert(test) : assert(test,msg) 
    ensure 
    puts 'take screenshot' unless passed 
    end 
end 

class MyTest < Test::Unit::TestCase 
    def setup 
    puts 'setup' 
    end 

    def teardown 
    puts 'teardown' 
    end 

    def test_something 
    safe_assert true 

    puts 'before failing assert' 
    safe_assert false, "message" 
    puts 'after failing assert' 
    end 
end 

de salida:

Loaded suite unittest 
Started 
setup 
before failing assert 
take screenshot 
teardown 
F 
Finished in 0.001094 seconds. 

    1) Failure: 
test_something(MyTest) [unittest.rb:5]: 
message 

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

Test run options: --seed 58428 

EDIT: en realidad se podría pasar los argumentos a assert de una manera más simple:

module Test::Unit::Assertions 
    def safe_assert(*args) 
    passed = assert(*args) 
    ensure 
    puts 'take screenshot' unless passed 
    end 
end 

también, podría envolver un estándar assert en un bloque begin - ensure - end si solo necesita esta funcionalidad con poca frecuencia:

class MyTest < Test::Unit::TestCase 
    def test_something 
    safe_assert true 

    puts 'before failing assert' 
    begin 
     passed = assert false, "message" 
    ensure 
     puts 'take screenshot' unless passed 
    end 
    puts 'after failing assert' 
    end 
end 

o se construye un método que asegura una captura de pantalla como en el siguiente ejemplo. En realidad, esto parece ser la forma más limpia de mí:

def screenshot_on_fail 
    passed = yield 
ensure 
    puts 'take screenshot' unless passed 
end 

class MyTest < Test::Unit::TestCase 
    def test_something_else 
    screenshot_on_fail do 
     assert true 
    end 

    screenshot_on_fail do 
     assert false, 'message' 
    end 
    end 
end 
+0

Esto parece una buena manera de hacerlo, ¡gracias! –

+0

¡De nada! no te olvides de aceptar la respuesta si resolvió tu problema :) –

+0

echa un vistazo a mi edición, de hecho hay una forma mucho más limpia de esto que me vino a la mente en este momento ':)' –

Cuestiones relacionadas