¿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
Josiah Kiehl
fuente
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
Elliot Winkler
fuente
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
15
¡Aviso! m Actualmente no funciona este Minitest 5.0 .
davetapley
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"
jduan
fuente
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
Andrew Grimm
fuente
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/
fguillen
fuente
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.

tuhaj
fuente
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
Alexander Gromnitsky
fuente
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 .

Rimian
fuente
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.

Laknath
fuente
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

Knugie
fuente
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.

sloneorzeszki
fuente
¿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

fuente
-1

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

sekmo
fuente