¿Es posible ejecutar una sola prueba en MiniTest?


168

Puedo ejecutar todas las pruebas en un solo archivo con:

rake test TEST=path/to/test_file.rb

Sin embargo, si quiero ejecutar solo una prueba en ese archivo, ¿cómo lo haría?

Estoy buscando una funcionalidad similar a:

rspec path/to/test_file.rb -l 25

3
8 años más tarde y para los usuarios de rails 5+ rails test path/to/test_file.rb:25ver @Derek_Hill ans - tomado de guides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Respuestas:


44

Estoy buscando una funcionalidad similar a la ruta rspec / to / file.rb -l 25

¡Sip! Usa la gema "m" de Nick Quaranto . Con ella puedes decir:

m spec/my_spec.rb:25

44
Si bien la respuesta funciona y fue exactamente lo que se preguntó :-) La forma de la Mini prueba de ejecutar una sola prueba es por coincidencia de nombres (ver la respuesta del Sr. Grimm). Si ha intentado esto y lo ha rechazado, es hora de probar las alternativas no estándar, como Nick's Gem.
notapatch

3
Es cierto, estoy de acuerdo. De hecho, deseo que te permita también pasar -n como una opción ... o que MiniTest solo sea compatible con el uso de números de línea y nombres de métodos.
Elliot Winkler


Si bien esta gema hace cosas similares a la forma rspec de ejecutar una sola prueba, Minitest tiene una forma integrada de ejecutar una sola prueba que era exactamente la pregunta. La dependencia no es necesaria. Es bueno saber que podría ser más fácil con una gema accesoria (como puede tener muchas alrededor) pero creo que para esta pregunta, las respuestas de minitest puro como de jduan o randomor encajarían mejor
cefigueiredo

209

El comando debe ser:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"

66
+1: esto es lo que quieres hacer. Si desea probar todas las pruebas en un archivo específico, simplemente déjelo TESTOPTS=...fuera
awenkhh

Muy útil respuesta. Hago que MinitestReporter muestre comandos de ejecución de pruebas fallidas al final del informe de prueba. Ver: gist.github.com/foton/141b9f73caccf13ccfcc
Foton

1
¿Qué hace el -v?
Jon Schneider

149

Has probado:

ruby path/to/test_file.rb --name test_method_name

10
¿Qué pasa con las pruebas que usan Minispec, definido como specify {}? Esos solo aparecen como test_0001_anonymous... y podría haber múltiples test_0001_anonymouss si se usa la misma sintaxis en múltiples bloques de descripción ... ¿alguna sugerencia para ejecutar pruebas individuales en este tipo de entorno?
neezer

1
"tc" significa "caso de prueba".
Andrew Grimm

44
Dice cannot load such file -- test_helper.
x-yuri

11
usar ruby -Itest path/to/tc_file.rb --name test_method_namecomo stackoverflow.com/a/15714985/327786
TlmaK0

bundle exec ruby -I lib path/to --name test_fit
puchu


49

Esta es una de las cosas que me preocupan string name definitionen las pruebas.

Cuando tengas:

def test_my_test
end

siempre sabes cómo se llama tu prueba para que puedas ejecutarla así:

ruby my_test -n test_my_test

Pero cuando tienes algo como:

it "my test" do
end

nunca está seguro de cómo se denomina internamente esta prueba, por lo que no puede usar la -nopción directamente.

Para saber cómo se nombra internamente esta prueba, solo tiene una opción: ejecutar todo el archivo para tratar de averiguar cómo buscar en los registros.

Mi solución es (temporalmente) agregar algo al nombre de prueba muy exclusivo como:

it "my test xxx" do
end

y luego use la versión RegEx del parámetro '-n' como:

ruby my_test.rb -n /xxx/

66
La versión regex del parámetro -n fue la pieza de información del embrague, ¡gracias!
Woahdae

Tenga en cuenta que puede verificar esto llamando __method__dentro del contexto del método que se está ejecutando actualmente (su prueba, en este caso). La implementación actual da como resultado algo así "does not break my stuff".gsub(" ", "_").prepend("test_"). Luego ejecute, por ejemplo ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff,.
TK-421


23

Puede usar esto para ejecutar un solo archivo:

rake test TEST=test/path/to/file.rb

Yo tambien uso

ruby -I"lib:test" test/path/to/file.rb

Para una mejor visualización.


12

Hay 2 formas de hacerlo:

  1. Ejecute pruebas 'manualmente' (vea la respuesta de Andrew Grimm).
  2. Hackea el Rake::TestTaskobjetivo para usar un cargador de pruebas diferente.

Rake::TestTask(del rastrillo 0.8.7) teóricamente es capaz de pasar opciones adicionales a MiniTest::Unitcon"TESTOPTS=blah-blah" opción de línea de comando, por ejemplo:

% rake test TEST = test / test_foobar.rb TESTOPTS = "- nombre test_foobar1 -v"

En la práctica, la opción --name(un filtro para los nombres de las pruebas) no funcionará debido a las características internas del rastrillo. Para solucionarlo, deberá escribir un pequeño parche de mono en su Rakefile:

# overriding the default rake tests loader
class Rake::TestTask
  def rake_loader
    'test/my-minitest-loader.rb'
  end
end

# our usual test terget 
Rake::TestTask.new {|i|
  i.test_files = FileList['test/test_*.rb']
  i.verbose = true 
}

Este parche requiere que crees un archivo test/my-minitest-loader.rb:

ARGV.each { |f|
  break if f =~ /^-/
  load f
}

Para imprimir todas las opciones posibles para Minitest, escriba

% ruby ​​-r minitest / autorun -e '' - --help

3
Tenga en cuenta que el ejemplo inicial funciona correctamente con un más reciente rake(0.9.2) y no se requiere parche de mono.
Confusión

1
Cuando probé con la versión de rastrillo 10.5.0 TESTOPTS="--name test_foobar"no funciona, pero TESTOPTS="--name=test_foobar"funciona.
kangkyu

11

Puede pasar --namepara ejecutar una prueba por su nombre o un número dentro de su nombre:

-n, --name PATTERN               Filter run on /regexp/ or string.

p.ej:

$ ruby spec/stories/foo_spec.rb --name 3

FAIL (0:00:00.022) test_0003_has foo
Expected: "foo"
Actual: nil

Esta bandera está documentada en el archivo README de Minitest .


1

Si está usando Turn gem with minitest, solo asegúrese de usar la Turn.config.patternopción ya que Turn Minitest runner no respeta la opción --name en los ARG.


Esta fue la pista que necesitaba para darme cuenta de que Turn era lo que tragaba la nameopción. ¡Gracias! Como ese turno ya no se mantiene, planeo migrar a reporteros más
pequeños

1

Estoy buscando una funcionalidad similar a:

ruta rspec / a / test_file.rb -l 25

No es una joya que hace exactamente eso: minitest-line.

gem install minitest-line
ruby test/my_file -l 5

de https://github.com/judofyr/minitest-line#minitest-line


Hola @ChrisHough, ¿podrías describir qué no funciona exactamente (por ejemplo, un mensaje de error)? El propósito de la gema de minitest-line es únicamente ejecutar una prueba en MiniTest. Si no funciona, es posible que haya encontrado un error en minitest-line.
knugie

1

yo suelo ruby /path/to/test -n /distinguishable word/

Editar: -nes una abreviatura de --name. distinguishable wordpuede ser cualquier cadena que coloque en la descripción de la prueba, por lo general uso alguna palabra aleatoria que sé que no estará presente en las descripciones de otras pruebas.


¿Puedes explicar eso más? ¿Qué significa ese -nparámetro?
Nico Haase

Es una abreviatura para --name. Solo una cosa de conveniencia. Especialmente útil con / regex /, generalmente solo pongo una palabra aleatoria en el nombre de una prueba (que sé que no estará presente en las descripciones de otras pruebas).
sloneorzeszki

1
Agregue alguna explicación sobre eso a la respuesta en sí, no a la sección de comentarios
Nico Haase,

0

Siguiente funcionará

def test_abc
end

test "hello world"
end

Esto puede correr por

bundle exec ruby -I test path/to/test -n test_abc

bundle exec ruby -I test path/to/test -n test_hello_word

-1

rails test path/to/test_file.rb:25 lo haré

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.