¿Cómo comenzar en TDD con Ruby on Rails? [cerrado]

167

Estoy familiarizado con los conceptos (tomé clases de prueba en la universidad), pero todavía no estoy seguro de cómo usarlos realmente, ya que nunca trabajé en un proyecto TDD "real".

Estoy a punto de comenzar el desarrollo de un proyecto usando Ruby on Rails (muy probablemente usando 2.3). Esta aplicación se utilizará para administrar datos, usuarios y algunos archivos. Al principio no será demasiado complicado, pero podría escalar mucho en los próximos 6 meses, así que creo que este es el momento adecuado para entrar más en TDD.

Tengo una idea básica sobre cómo hacerlo, pero todavía necesito algunos consejos y consejos:

  • ¿Qué artículo de Ruby on Rails TDD 101 debería leer?

  • ¿Qué necesito para probar?

  • ¿Qué gema / complemento debo usar?

  • ¿Debo usar rspec ? ¿Algo más?

  • Una vez que tengo todas mis clases de prueba, ¿cómo voy a implementarlas? (por ejemplo: integración continua)

  • ¿Cuánto tiempo consume TDD realmente?

  • ¿Necesito leer un libro sobre esto o puedo obtener todo simplemente jugando y leyendo tutoriales en línea? Si necesito leer un libro, ¿qué libro?


Me gusta aprender con ejemplos, así que alguien podría decirme cómo iría y tomar un enfoque TDD para resolver este problema:

Tengo empresas Tengo contactos Un contacto se puede vincular a 1 empresa. Una empresa puede tener múltiples contactos. Quiero crear formas de crear contactos, empresas y vincular contactos a empresas.

No tiene que usar este ejemplo en su respuesta, pero sería útil :)

marcgg
fuente

Respuestas:

202

¿Qué artículo de Ruby on Rails TDD 101 debería leer?

Comenzaré con una guía para probar aplicaciones de rieles .

También Railscast tiene algunas excelentes capturas de pantalla sobre cómo usar diferentes herramientas de prueba.

¿Qué necesito para probar?

Comenzaré con los modelos, ya que son fáciles de probar. La regla simple es que debe cubrir cada declaración if en su prueba.

Debe probar el propósito del método (para asegurarse de que funciona como se esperaba), así como todos los casos límite.

También asegúrese de no terminar con las pruebas.

¿Qué gema / complemento debo usar? ¿Debo usar rspec? ¿Algo más?

Cuando comiences, solo úsalo Test Unit. Puede usar rspeco cucumberdespués de familiarizarse con los conceptos básicos.

Autotestes una buena herramienta si quieres ser realmente probado. Pero es un 'bonito tener' no requerido.

Una vez que tengo todas mis clases de prueba, ¿cómo puedo implementarlas?

No estoy seguro de la pregunta. Usualmente no despliegas las pruebas. Una vez que tenga todas sus clases de prueba, simplemente escriba 'prueba de rastrillo' para ejecutar todas sus pruebas.

¿Cuánto tiempo consume TDD realmente?

Realmente ahorra tiempo. Si te gusta el rompecabezas de laberinto, sabes que casi siempre es más fácil resolverlo si vas de principio a fin. Lo mismo con TDD. Sin Test Driven, siempre está pensando 'qué debería hacer a continuación'. Con Test Driven, la prueba le dirá qué hacer a continuación (se rompe si la lógica no está allí, por lo que solo necesita reparar la parte rota). También tiene menos errores que le ahorrarán mucho tiempo a largo plazo.

¿Necesito leer un libro sobre esto o puedo obtener todo simplemente jugando y leyendo tutoriales en línea? Si necesito leer un libro, ¿qué libro?

No necesitas un libro. La forma más eficiente de aprender algo es: simplemente hazlo. Vuelva al libro o los recursos en línea una vez que encuentre una pregunta o problema. Esto también es ágil.

En su ejemplo, las cosas que necesitan pruebas son: Un contacto puede vincularse a 1 compañía, Una compañía puede tener múltiples contactos, crear formas de crear contactos y vincular contactos a compañías.

class CompanyTest <Test::Unit
    def test_relationship # test associations/relationships
        c = companies(:some_company)
        assert_equal [a list of contacts], c.contacts # make sure a company can have multiple contacts
    end
end

class ContactTest<Test::Unit
   def  test_relationships
        c = contact(:some_contact)
        assert_equal some_company, c.company # make sure the contact link to 1 company
   end

   def  test_create/add
        # test create contacts, here you need to make sure the contact is created correctly, and linked to company correctly
   end
end
ez.
fuente
3
El enlace al artículo está roto, pero lo encontré aquí: web.archive.org/web/20100325215651/http://bloritsch.d-haven.net/…
fivetwentysix
13

Produje una serie de videos de 6 episodios que se enseñó como clase pública en San Francisco en el verano de 2010. El material cubre las pruebas y la eficiencia del desarrollador en Rails 2.3 usando RSpec 1.3. Ligeramente anticuado, pero los conceptos principales se aplican a Rails 3 con Rspec 2.x

http://www.rubyfocus.biz/class_video/2010/07/19/rails_tdd_class_1.html

Wolfram Arnold
fuente
5

TDD se trata de escribir pruebas primero. Básicamente, esto te obliga a escribir tu propio cliente antes de escribir el código de tu aplicación. El ciclo generalmente es escribir una prueba para una API que no existe, ejecutar la prueba esperando que falle, vaya a escribir su código API, ejecute su prueba nuevamente y asegúrese de que pase. Luego escribe tu próxima prueba ... y así sucesivamente.

También te puede interesar esta guía de Rails .

Andy Gaskell
fuente
3

¿Qué gema / complemento debo usar?

Siempre me ha gustado debería haberlo hecho .

¿Cuánto tiempo consume TDD realmente?

La razón por la que siempre he favorecido el desarrollo de TDD es que se enfoca en cómo implementaré un fragmento de código específico. Tengo la sensación anecdótica de que cada vez que me adhiero más a los principios de TDD, paso menos tiempo trabajando nuevamente más tarde. Sin embargo, la cantidad de tiempo invertido depende de qué tan bien escribas las pruebas unitarias. Si las pruebas unitarias no capturan el comportamiento esperado, se desperdicia todo el tiempo dedicado a ellas.

Patrick Robertson
fuente