2011-01-24 31 views
59

Descargué el código fuente de un proyecto, encontré un error y lo solucioné.¿Cómo ejecutar todas las pruebas con minitest?

Ahora quiero ejecutar pruebas para averiguar si he roto algo.

Las pruebas están en minitest DSL.

¿Cómo puedo ejecutarlos todos a la vez?

Busqué tareas de rake aplicables, etc., pero no encontré ninguna.

+1

¿Hizo alguna prueba individual? ¿Si es así, cómo? –

Respuesta

84

Aquí hay un enlace al Rake::TestTask.

Hay un ejemplo en la página para comenzar.
voy a publicar otro que estoy usando en este momento para una joya:

require 'rake/testtask' 

Rake::TestTask.new do |t| 
    t.pattern = "spec/*_spec.rb" 
end 

Como se puede ver, supongo que mis archivos están todos en /lib y que las especificaciones de mi están en /spec y se denominan whatever_spec.rb

Espero que ayude.

+0

Gracias, bloqueos. Es lo que he estado buscando. – guai

+3

Poner lo que @locks menciona en un Rakefile le permitirá ejecutar 'rake test' – Nick

22

La respuesta de las cerraduras es mejor, pero también quería señalar que también puede ejecutar minitest directamente desde el comando como con el comando ruby. Para ejecutar las pruebas en el archivo spec/calculator_spec.rb de ejecución:

$ ruby spec/calculator_spec.rb 

Recuerde incluir el siguiente código en el archivo calculator_spec.rb:

require 'minitest/spec' 
require 'minitest/autorun' 

a ejecutar todas las pruebas en la especificación/directorio , utilice el siguiente comando (véase este post para más detalles Globbing doesn't work with Minitest - Only one file is run)

$ for file in spec/*.rb; do ruby $file; done 
16

esto es lo que hace Rake::TestTask bajo el capó, más o menos:

ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb 

Nota: lib & test/test*.rb (arriba) son los valores predeterminados pero test & test/*_test.rb, respectivamente, son más típicas.

Fuente: rake/testtask.rb at c34d9e0 line 169

Si está usando JRuby y quieren evitar pagar el costo de inicio dos veces (una vez para Rake y luego una vez por el subproceso que inicia Rake), sólo tiene que utilizar ese comando.

+0

El enlace de la documentación está roto aquí. –

13

Aquí es mi toda rakefile, que puse en mi directorio superior:

task :default => :test 
task :test do 
    Dir.glob('./test/*_test.rb').each { |file| require file} 
end 

Para ejecutar todos mis archivos de prueba a la vez, yo sólo escribo rake. ¡Eso es!

Asegúrese de tener require 'minitest/autorun' en la parte superior de cada uno de sus archivos Minitest. Dir.glob definitivamente SI trabaja con Minitest.

Para obtener la salida Minitest bonita, de color, con los nombres de todos mis métodos de prueba, tengo el archivo minitest_helper.rb en mi directorio/prueba. (Tuvo que instalar la gema MINITEST-reporteros):

require 'minitest/reporters' 
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new) 
require 'minitest/autorun' 

sólo tenía que require_relative './minitest_helper' en la parte superior de cada uno de mis archivos de prueba.

+0

Esto es bueno, excepto por el hecho de que si usas bundler ... en ese caso, cada declaración requerida se completará porque las gemas no estarían en '$ LOAD_PATH'. –

-1

Si usted no tiene rastrillo, intente esto:

http://blog.gingergriffis.com/post/85871430778/ruby-how-to-run-all-tests-in-a-directory

# run_all_tests.rb 

require 'find' 
require 'optparse' 

options = { 
    :exclude => [], 
} 

OptionParser.new do |opts| 
    opts.on('--exclude Comma Separated String', 
      'Test scripts to exclude') do |css| 
    options[:exclude] = css.split(',') 
    end 
end.parse! 

commands = [] 

Find.find(File.dirname(__FILE__)) do |path| 
    Find.prune if path =~ /#{__FILE__}$/ 
    if !File.directory?(path) && (path =~ /(.*)\.rb$/) 
     if options[:exclude].none? {|e| path.include?(e)} 
     commands << "ruby #{path}" 
     end 
    end 
end 
command_string = commands.join(" && ") 
exec(command_string) 
+0

Eso es muy costoso, ya que requiere un intérprete de rubí para cada prueba que desee ejecutar. También es mucho código para hacer algo muy simple. Eche un vistazo a la solución de Theo. Hace exactamente lo mismo, es más eficiente y tampoco necesita 'rake'. – Overbryd

4

Esto también se puede hacer a través de un Makefile.

default: 
    echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby 

ejecutando make ejecutará todas sus pruebas.

1

Otra forma de hacerlo utilizando solo la biblioteca estándar de Ruby es con Dir.glob. Desde dentro de un archivo de rubí, este sería el siguiente:

require "minitest/autorun" 

Dir.glob("**/*Test.rb") { |f| require_relative(f) } 

O desde la línea de comandos, puede utilizar este comando:

ruby -I . -e "require 'minitest/autorun'; Dir.glob('**/*Test.rb') { |f| require(f) }" 

Dir.glob('**/*Test.rb') búsquedas de forma recursiva el directorio actual para cualquier archivo que coincide con *Test.rb, así que simplemente tomamos todos esos archivos y require o require_relative. Desde la línea de comandos, require_relative falla, por lo que utilizar require pero primero agregar el directorio actual al $LOAD_PATH través -I .

1

$ rake test se quedaron sin los rieles 5.0 caja.

+0

Esto no ejecuta las pruebas de mi sistema, solo las pruebas de componentes. –

Cuestiones relacionadas