tests run rails how ruby-on-rails ruby testing rspec minitest

ruby on rails - run - Minitest y Rspec



rails run rspec (2)

Acabo de ver un Railscast para Minitest.

¿Cuáles son los pros y contras para usar RSpec vs Minitest para probar una aplicación de rieles? ¿Qué características perder al convertir de RSpec a Minitest?


Convertí a Minitest de especificaciones de Test/Unit con shoulda , y vale la pena. Se acaba con la repetición y dicen que también mejora la velocidad. Realmente nunca utilicé RSpec. En cambio, escribí mi propio marco de pruebas y burlas primitivas (solo con el propósito de entender la burla, la abandoné al cambiarme a Minitest). Creo que el troceo / burla en RSpec podría ser más avanzado, por lo que si ya lo aprendió, simplemente continúe usándolo. De lo contrario, quédese con Minitest, lo que le permitirá colaborar con personas que no conocen RSpec, como yo.


Soy uno de los desarrolladores de RSpec y nunca he usado minitest, así que tenga en cuenta mis sesgos al leer esta respuesta.

En general, el poder de RSpec proviene del hecho de que reifica tantos conceptos de prueba en objetos de primera clase. Donde Test :: Unit y Minitest usan métodos simples para realizar afirmaciones, RSpec usa objetos de comparación de primera clase que admiten negación, autodescripción y más. Los ejemplos de RSpec son objetos de primera clase que admiten metadatos enriquecidos; Las compilaciones minitest / spec bloquean en métodos simples, que no admiten el mismo tipo de metadatos enriquecidos. RSpec admite la especificación de comportamientos compartidos utilizando una construcción de primera clase (grupos de ejemplos compartidos) que acepta argumentos; w / minitest puede usar inheritance o mixin para reutilizar las pruebas , pero no tiene el mismo tipo de soporte de primera clase. RSpec tiene una API de formateador explícita (y hay muchos formateadores de terceros que la usan); No estoy al tanto de que minitest tenga el mismo tipo de API de formateador de primera clase.

Como alguien que está constantemente haciendo pruebas y practicando TDD todo el día, encuentro que el poder que RSpec me da es muy útil. Sin embargo, a mucha gente le parece excesivo y existe un costo cognitivo adicional para las abstracciones adicionales.

Aquí hay algunas características específicas que RSpec tiene que creo que minitest carece:

  • before(:all) hooks (tenga en cuenta que esta es una característica del usuario avanzado de RSpec que rara vez se debe usar; solo la he usado en algunas ocasiones en muchos años de uso de RSpec)
  • around(:each) ganchos
  • Grupos de ejemplos compartidos
  • Contextos compartidos
  • Compatibilidad con metadatos enriquecidos que se puede usar para controlar qué ejemplos se ejecutan, en qué grupo de ejemplo se incluyen los contextos compartidos, en qué grupos de ejemplos se mezclan los módulos y más.
  • Soporte integrado para una amplia gama de funciones de burla con rspec-mocks; Minitest :: Mock es mucho más simple y más limitado en comparación.
  • RSpec tiene rspec-fire , que es increíble.

Beneficios de usar Minitest:

  • Está integrado en la biblioteca estándar, por lo que no necesita instalar nada adicional.
  • Se puede usar en def test_blah o it ''blah'' estilos it ''blah'' .
  • La base de código es muy pequeña y simple. RSpec, en virtud de su edad avanzada y características adicionales, es más grande en comparación.
  • Minitest carga más rápido que RSpec (se trata de 4 archivos de código en comparación con RSpec que tiene muchos archivos repartidos en 3 gemas), pero tenga en cuenta que RSpec no es lento en absoluto; En la mayoría de mis proyectos en estos días, obtengo retroalimentación de prueba de RSpec en menos de un segundo (y a menudo en menos de 500 ms).

En general, es un poco como Sinatra vs. Rails, y creo que Minitest y RSpec son buenas opciones dependiendo de tus necesidades.

Una última cosa: si hay aspectos específicos de Minitest que te gustan más, pero otras cosas que te gustan más de RSpec, pueden combinarse y combinarse fácilmente. Escribí una publicación en el blog sobre esto , si estás interesado.