2011-07-16 16 views
46

Soy un examinador bastante novato, pero he tratado de mejorar en TDD en Rails.¿Cómo configurar MiniTest?

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 tan obvias que nadie se ha molestado en escribirlo ...

¿Alguien me puede explicar cómo configurar algunos archivos Minitest/spec y ponerlos en funcionamiento para que pueda comparar el rendimiento contra Rspec?

EDITAR

Específicamente estos son los elementos básicos que más necesita saber:

  1. ¿Necesita un archivo test_helper (como spec_helper) y si es así, ¿cómo crear él?
  2. ¿Cómo se ejecuta minitest? No parece haber un equivalente a rspec spec o rspec path/to/file_spec.rb, ¿qué me estoy perdiendo?

¡Gracias!

+1

Un punto de partida: http://metaskills.net/2011/03/26/using-minitest-spec-with-rails/ – kain

+1

Kain, gracias. He visto esta publicación ... desafortunadamente no cubre el paso más básico: ¿necesitas un archivo test_helper (como spec_helper) y, de ser así, cómo lo creas? Y, ** ¿cómo se ejecuta minitest **? No parece haber un equivalente a 'rspec spec' o' rspec path/to/file_spec.rb'. ESO es en lo que realmente estoy atorado. – Andrew

+0

Por lo que vale, esta pregunta obtuvo un par de visitas y una favorita, pero no votos por votos. En este momento está perdido en la jungla, si quieres ver respondida esta pregunta, vota por lo que vuelve a ponerse delante de las personas. – Andrew

Respuesta

39

Esta pregunta es similar a How to run all tests with minitest?

El uso de Ruby 1.9.3 y 0.9.2.2 Rake, dada una estructura de directorios de esta manera:

Rakefile 
lib/alpha.rb 
spec/alpha_spec.rb 

esto es lo que alpha_spec.rb podría ser:

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í es Rakefile

require 'rake' 
require 'rake/testtask' 

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

Puede ejecutar

  • 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. Esto, unido 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
+0

Muy útil y muy completo, gracias Patrick! – Andrew

4

¿Qué versión de Ruby estás usando?

En mi entender, 1.9 introdujo MiniTest, que reemplaza Test::Unit por completo, con una API compatible hacia atrás. Entonces, si estás en 1.9 y tu aplicación Rails hace referencia a Test::Unit, en realidad ya está usando MiniTest.

Echa un vistazo a la fuente de Ruby - test/unit.rb para 1.9.2 tiene las siguientes requiere:

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. Eche 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 muy bien juntos, así que vuelve con algunas preguntas más si te quedas atascado.

¡La mejor de las suertes!

4

Tenga en cuenta que watchr o spork no son requisitos para la ejecución de pruebas. Son una conveniencia para hacer autotesting. Pero la forma más básica se puede ejecutar una serie de pruebas con el rubí Minitest es en sí:

$ ruby myfileoftests.rb 
1

Las nuevas versiones de RSpec (desde 2,8 lanzado en ene 2012) tienen un aumento dramático de velocidad. Here es una exploración de las diferencias de rendimiento y una comparación con MiniTest.

También 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.

3

Echa un vistazo a este getting started video para 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 de ayuda, así como la forma de ejecutar las pruebas utilizando una tarea rastrillo.Si desea ejecutar una prueba específica puede hacerlo con lo siguiente:

ruby -Itest test/models/user_test.rb 
1

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

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

Para ejecutar todos mis archivos Minitest de una 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 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.