ruby-on-rails - matchers - rspec rails 5
¿Cómo configurar MiniTest? (7)
Soy un examinador bastante novato, pero he tratado de mejorar en TDD en Rails.
RSpec funciona muy bien, pero mis pruebas son bastante lentas. Escuché que MiniTest es mucho más rápido, y el MiniTest / Spec DSL parece bastante similar a como estoy acostumbrado a trabajar con RSpec, así que pensé en probarlo.
Sin embargo, no he podido encontrar nada en la web que brinde un tutorial sobre cómo configurar y ejecutar Minitest. Aprendí a probar el libro de RSpec, y no tengo idea de cómo se supone que Test :: Unit o MiniTest funcionen. Tengo la gema en mi gemfile, he escrito algunas pruebas simples, pero no tengo idea de dónde colocarlas o cómo ejecutarlas. Me imagino que esta es una de esas cosas que es tan obvia que nadie se ha molestado en escribirla ...
¿Alguien puede explicarme cómo configurar algunos archivos Minitest / spec y ejecutarlos para que pueda comparar el rendimiento contra Rspec?
EDITAR
Específicamente, estos son los conceptos básicos que más necesito saber:
- ¿Necesita un archivo test_helper (como spec_helper) y, de ser así, cómo lo crea?
- ¿Cómo se ejecuta minitest? No parece haber un equivalente para la
rspec spec
rspec path/to/file_spec.rb
o larspec path/to/file_spec.rb
, ¿qué es lo que me falta?
¡Gracias!
¿Qué versión de Ruby estás usando?
Según tengo entendido, 1.9 introdujo MiniTest
, que reemplaza a Test::Unit
completo, con una API compatible con versiones anteriores. Entonces, si estás en 1.9 y tu aplicación Rails hace referencia a Test::Unit
, en realidad ya está usando MiniTest
.
Eche un vistazo a su fuente de Ruby - test/unit.rb
para 1.9.2 si necesita lo siguiente:
require ''minitest/unit''
require ''test/unit/assertions''
require ''test/unit/testcase''
Y test/unit/assertions
incluye MiniTest::Assertions
.
Hacer que tus pruebas corran más rápido es otro arte oscuro. Echa un vistazo a spork y watchr . El primero mantiene su aplicación inicializada, vuelve a cargar los archivos modificados y se bifurca antes de cada ejecución de su conjunto de pruebas. Este último mira los archivos en su repositorio para ver los cambios y ejecuta automáticamente sus casos de prueba asociados.
Juntos te dan una configuración TDD bastante mala. Usted escribe un caso de prueba para su nuevo modelo y se ejecuta automáticamente y falla. Luego, cada vez que guarda el modelo asociado, ese caso de prueba vuelve a ejecutar, muy rápidamente. Obtienes un feedback casi instantáneo sobre si eres rojo / verde.
Ambos son un poco difíciles de configurar y comportarse bien juntos, así que vuelve con algunas preguntas más si te quedas atascado.
¡La mejor de las suertes!
Aquí está mi rakefile
completo, que puse en mi directorio principal:
task :default => :test
task :test do
Dir.glob(''./test/*_test.rb'').each { |file| require file}
end
Para ejecutar todos mis archivos Minitest a la vez, simplemente 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 una salida Minitest bonita y de color, con nombres de todos mis métodos de prueba, tengo el archivo minitest_helper.rb
en mi directorio / test. (Tuve que instalar los gemelos minitest-reporters):
require ''minitest/reporters''
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
require ''minitest/autorun''
Solo tuve que require_relative ''./minitest_helper''
en la parte superior de cada uno de mis archivos de prueba.
Esta pregunta es similar a Cómo ejecutar todas las pruebas con minitest?
Usando Ruby 1.9.3 y Rake 0.9.2.2, dado un diseño de directorio como este:
Rakefile
lib/alpha.rb
spec/alpha_spec.rb
Aquí es cómo se alpha_spec.rb
:
require ''minitest/spec''
require ''minitest/autorun'' # arranges for minitest to run (in an exit handler, so it runs last)
require ''alpha''
describe ''Alpha'' do
it ''greets you by name'' do
Alpha.new.greet(''Alice'').must_equal(''hello, Alice'')
end
end
Y aquí está Rakefile
require ''rake''
require ''rake/testtask''
Rake::TestTask.new do |t|
t.pattern = ''spec/**/*_spec.rb''
end
Tu puedes correr
- todas las pruebas:
rake test
- una prueba:
ruby -Ilib spec/alpha_spec.rb
No sé si el uso de un spec_helper.rb
con minitest es común o no. No parece haber un método práctico para cargar uno. Agregue esto al Rakefile:
require ''rake''
require ''rake/testtask''
Rake::TestTask.new do |t|
t.pattern = ''spec/**/*_spec.rb''
t.libs.push ''spec''
end
Entonces spec/spec_helper.rb
puede contener varias cosas redundantes:
require ''minitest/spec''
require ''minitest/autorun''
require ''alpha''
Y spec/alpha_spec.rb
reemplaza las partes redundantes con:
require ''spec_helper''
- todas las pruebas:
rake test
- una prueba:
ruby -Ilib -Ispec spec/alpha_spec.rb
Las versiones más recientes de RSpec (desde 2.8 lanzadas en enero de 2012) tienen un aumento de velocidad espectacular. Here hay una exploración de las diferencias de rendimiento y una comparación con MiniTest.
Además, encontré this screencast de Ryan Bates una excelente introducción a MiniTest. Tenga en cuenta que este es uno de los videos pro y tendrá que suscribirse para verlo.
Mira este video de inicio de minitest-rails . Recorre el proceso de configuración de Minitest para una aplicación de Rails.
http://www.youtube.com/watch?v=xA2f2zBNvsc
El tutorial muestra cómo crear un archivo auxiliar y cómo ejecutar las pruebas utilizando una tarea de rake. Si desea ejecutar una prueba específica, puede hacerlo con lo siguiente:
ruby -Itest test/models/user_test.rb
Patrick escribió una muy buena explicación y ejemplo. Para los lectores del futuro, solo tengan en cuenta que las expectativas globales ahora se han depreciado, y se eliminarán en Minitest 6. Se requiere un cambio casi trivial en el ajuste de lo que está probando en una llamada a expect
.
require ''minitest/spec''
require ''minitest/autorun'' # arranges for minitest to run (in an exit handler, so it runs last)
require ''alpha''
describe ''Alpha'' do
it ''greets you by name'' do
expect(Alpha.new.greet(''Alice'')).must_equal(''hello, Alice'')
end
end
Tenga en cuenta que watchr o spork no son requisitos para ejecutar pruebas. Son una conveniencia para hacer autotesting. Pero la forma más básica en que puede ejecutar un conjunto de pruebas MiniTest es con ruby en sí mismo:
$ ruby myfileoftests.rb