2012-01-06 9 views
7

Lo sé. Esto esta desaconsejado Por razones que no entraré, necesito ejecutar mis pruebas en el orden en que fueron escritas. De acuerdo con la documentación, si mi clase de prueba (la llamaremos TestClass) extiende Minitest :: Unit :: TestCase, entonces debería poder llamar al método público i_suck_and_my_tests_are_order_dependent! (Gee - ¿crees que el tipo que creó Minitest tenía un opinión sobre eso?). Además, también existe la opción de llamar a un método llamado test_order y especificar :alpha para anular el comportamiento predeterminado de :random. Ninguno de estos me funciona.¿Cómo forzo efectivamente a Minitest a ejecutar mis pruebas en orden?

He aquí un ejemplo:

class TestClass < Minitest::Unit::TestCase 

    #override random test run ordering 
    i_suck_and_my_tests_are_order_dependent! 

    def setup 
    ...setup code 
    end 

    def teardown 
    ...teardown code 
    end 

    def test_1 
    test_1 code.... 
    assert(stuff to assert here, etc...) 
    puts 'test_1' 
    end 

    def test_2 
    test_2_code 
    assert(stuff to assert here, etc...) 
    puts 'test_2' 
    end 

end 

Cuando ejecuto esto, me sale:

undefined method `i_suck_and_my_tests_are_order_dependent!' for TestClass:Class (NoMethodError) 

Si se sustituye la llamada i_suck método con un método en la parte superior a la:

def test_order 
    :alpha 
end 

Mi prueba se ejecuta, pero puedo decir desde el puts para cada método que las cosas todavía están r desactivé en orden aleatorio cada vez que ejecuto las pruebas.

¿Alguien sabe lo que estoy haciendo mal? Gracias.

Respuesta

3

i_suck_and_my_tests_are_order_dependent! puede ser una adición posterior a la minitest & no disponible como método de núcleo Ruby. En ese caso, te gustaría para forzar el uso de la versión de la gema:

require 'rubygems' 
gem 'minitest' 
+0

De acuerdo; no use la minitest incorporada. Usa la gema – naomik

+0

n.b. esto fue renombrado https://github.com/seattlerb/minitest/pull/400 –

+0

Aww. Me encantó ese nombre. –

2

creo que el método * * test_order debe ser un método de clase y no un método de instancia de este modo:

# tests are order dependent 
def self.test_order 
    :alpha 
end 
4

Si acaba de añadir test_order: alfa a su clase de prueba, las pruebas se ejecutan en orden:

class TestHomePage 

def self.test_order 
:alpha 
end 

def test_a 
puts "a" 
end 

def test_b 
puts "b" 
end 

end 
1

Tenga en cuenta que, a partir de minitest 5.10.1, el método i_suck_and_my_tests_are_order_dependent!/Directiva es completamente no funcional en suites de prueba utilizando la sintaxis MiniTest::Spec. El método Minitest.test_order aparentemente no se está llamando en absoluto.

EDIT: Esto ha sido un problema conocido desde Minitest 5.3.4: vea seattlerb/minitest#514 para el lamento y el acicalamiento por golpe.

Usted y yo no somos los que "chupan". Lo que se necesita es una herramienta de especificación BDD para Ruby sin el engrosamiento de RSpec y sin la actitud de fraternidad y desprecio por las prácticas comunitarias más amplias de MiniTest. ¿Alguien tiene alguna indicación?

0

La mejor manera de intervenir en esta cadena puede ser para anular un método de clase runnable_methods:

def self.runnable_methods 
    ['run_first'] | super | ['run_last'] 
end 

#Minitest version: 
def self.runnable_methods 
    methods = methods_matching(/^test_/) 

    case self.test_order 
    when :random, :parallel then 
    max = methods.size 
    methods.sort.sort_by { rand max } 
    when :alpha, :sorted then 
    methods.sort 
    else 
    raise "Unknown test_order: #{self.test_order.inspect}" 
    end 
end 

puede reordenar probar cualquier forma adecuada alrededor. Si define sus pruebas ordenadas especiales con

test 'some special ordered test' do 
end 

, no se olvide de eliminarlos de los resultados de la llamada súper.

En mi ejemplo, necesito estar seguro solo en una prueba en particular para ejecutar la última, así que guardo orden aleatorio en toda la suite y coloco 'run_last' al final de la misma.

Cuestiones relacionadas