más allá del testing
DESCRIPTION
Ponencia sobre buenas prácticas de testing en la Conferencia Rails '2007 (Madrid 22 y 23 de noviembre), por Sergio Gil y Christos ZisopoulosTRANSCRIPT
![Page 1: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/1.jpg)
Más allá del testingSergio Gil
Christos Zisopoulos
![Page 2: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/2.jpg)
Estrategias de testing
![Page 3: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/3.jpg)
DDT: Development Driven Testing
![Page 4: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/4.jpg)
DDT: Development Driven Testing
Escribir los tests después de la primera iteración
del código
![Page 5: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/5.jpg)
Por qué
![Page 6: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/6.jpg)
Por qué
• A veces la especificación no existe es difusa, y hay poco tiempo
![Page 7: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/7.jpg)
Por qué
• A veces la especificación no existe es difusa, y hay poco tiempo
• Es más fácil para empezar
![Page 8: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/8.jpg)
Por qué
• A veces la especificación no existe es difusa, y hay poco tiempo
• Es más fácil para empezar
• Si tienes código ya escrito sin tests, es la única manera de que los tenga =;-)
![Page 9: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/9.jpg)
Por qué
![Page 10: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/10.jpg)
Por qué
• Si tu código (ya existente) no está escrito con TDD/BDD en mente, es más fácil el DDT
![Page 11: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/11.jpg)
Por qué
• Si tu código (ya existente) no está escrito con TDD/BDD en mente, es más fácil el DDT
• Es mucho mejor que NO testear
![Page 12: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/12.jpg)
Por qué
• Si tu código (ya existente) no está escrito con TDD/BDD en mente, es más fácil el DDT
• Es mucho mejor que NO testear
• Es lo que hace DHH =;-)
![Page 13: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/13.jpg)
TDD: Test Driven Development
![Page 14: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/14.jpg)
TDD: Test Driven Development
Escribir los tests antes de implementar
el código
![Page 15: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/15.jpg)
Por qué
![Page 16: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/16.jpg)
Por qué• Te fuerza a pensar en el código y en su diseño
antes de escribirlo
![Page 17: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/17.jpg)
Por qué• Te fuerza a pensar en el código y en su diseño
antes de escribirlo
• Te fuerza tener contratos de interacción concretos entre los componentes de tu código
![Page 18: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/18.jpg)
Por qué• Te fuerza a pensar en el código y en su diseño
antes de escribirlo
• Te fuerza tener contratos de interacción concretos entre los componentes de tu código
• Escribir un método cuyos resultados ya conoces es más fácil que escribirlo y luego imaginar cuál será su salida
![Page 19: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/19.jpg)
Por qué• Te fuerza a pensar en el código y en su diseño
antes de escribirlo
• Te fuerza tener contratos de interacción concretos entre los componentes de tu código
• Escribir un método cuyos resultados ya conoces es más fácil que escribirlo y luego imaginar cuál será su salida
• Si quieres refactorizar un método, te asegura que no vas a romper nada
![Page 20: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/20.jpg)
BDD: Behaviour Driven Testing
![Page 21: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/21.jpg)
BDD: Behaviour Driven Testing
Escribir, antes de implementar, especificaciones que luego
sirvan para testear
![Page 22: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/22.jpg)
Por qué
![Page 23: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/23.jpg)
Por qué
• Es descriptivo
![Page 24: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/24.jpg)
Por qué
• Es descriptivo
• Sirve de documentación (es legible por humanos normales)
![Page 25: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/25.jpg)
Por qué
• Es descriptivo
• Sirve de documentación (es legible por humanos normales)
• Ayuda a crear mejores modelos y mejores interacciones entre ellos
![Page 26: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/26.jpg)
Por qué
• Es descriptivo
• Sirve de documentación (es legible por humanos normales)
• Ayuda a crear mejores modelos y mejores interacciones entre ellos
• Es más fácil de escribir
![Page 27: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/27.jpg)
Patrones y buenas prácticas
![Page 28: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/28.jpg)
El buen código es fácil de testear
![Page 29: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/29.jpg)
El buen código es fácil de testear
El código fácil de testear es bueno
![Page 30: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/30.jpg)
El buen código es fácil de testear
El código fácil de testear es bueno
![Page 31: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/31.jpg)
Números mágicos
![Page 32: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/32.jpg)
Números mágicos
• Hasta 7 acciones por controlador
![Page 33: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/33.jpg)
Números mágicos
• Hasta 7 acciones por controlador
• Hasta 10 líneas por acción
![Page 34: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/34.jpg)
Números mágicos
• Hasta 7 acciones por controlador
• Hasta 10 líneas por acción
• Si te hace falta más, sepáralo, te falta algo:
• Un modelo
• Un controlador
• Una librería
![Page 35: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/35.jpg)
Ley de Deméter
![Page 36: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/36.jpg)
Ley de Deméter
• “Habla sólo con tus inmediatos amigos”
![Page 37: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/37.jpg)
Ley de Deméter
• “Habla sólo con tus inmediatos amigos”
• Un objeto debería asumir lo mínimo posible acerca de la estructura o propiedades de nada más, incluyendo sus subcomponentes
![Page 38: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/38.jpg)
post.comments.map(&:owner).map(&:email)post.comments.map(&:owner_email)post.commentator_emails
![Page 39: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/39.jpg)
post.comments.map(&:owner).map(&:email)post.comments.map(&:owner_email)post.commentator_emails
¡Más fácil de mockear!
![Page 40: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/40.jpg)
# Mal:# # post# post.coments# post.comments.map(&:owner)# post.comments.map(&:owner).map(&:email)
before(:each) do @owner = User.new @owner.stubs(:email).returns('[email protected]') @comment = Comment.new @comment.stubs(:owner).returns(@owner)
@post = Post.new @post.stubs(:comments).returns([@comment])end
specify 'should return a list of comentator emails' do post.comments.map(&:owner).map(&:email).should.equal ['[email protected]']end
![Page 41: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/41.jpg)
# Bien:# # comment.owner_emails -> owners.map(&:email)# post.commentator_emails -> comments.map(&:owner_emails)#
before(:each) do @post = Post.new @post.stubs.(:commentator_emails).returns(['[email protected]'])end
specify 'should return a list of comentator emails' do post.commentator_emails.should.equal ['[email protected]']end
![Page 42: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/42.jpg)
@@valid_model_attributes
![Page 43: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/43.jpg)
@@valid_model_attributes
# en test_helper.rb@@valid_post_attributes = { :title => 'Más allá del testing', :created_at => Time.now, :text => 'Bla, bla, bla...' }
![Page 44: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/44.jpg)
@@valid_model_attributes
# en test_helper.rb@@valid_post_attributes = { :title => 'Más allá del testing', :created_at => Time.now, :text => 'Bla, bla, bla...' }
it 'should be invalid without title' do @post = Post.new(@@valid_post_attributes.except(:title)) @post.should.not.validateend
![Page 45: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/45.jpg)
La decisión es QUÉ testear
![Page 46: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/46.jpg)
La decisión es QUÉ testear
• No testees ActiveRecord
![Page 47: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/47.jpg)
La decisión es QUÉ testear
• No testees ActiveRecord
• Testea las validaciones
![Page 48: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/48.jpg)
La decisión es QUÉ testear
• No testees ActiveRecord
• Testea las validaciones
• Testea las interacciones entre modelos (teniendo en cuenta la Ley de Deméter)
![Page 49: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/49.jpg)
La decisión es QUÉ testear
![Page 50: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/50.jpg)
La decisión es QUÉ testear
• Testea siempre los casos límite
![Page 51: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/51.jpg)
La decisión es QUÉ testear
• Testea siempre los casos límite
• Testea las vistas puntualmente
![Page 52: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/52.jpg)
La decisión es QUÉ testear
• Testea siempre los casos límite
• Testea las vistas puntualmente
• Testea los controladores teniendo en cuenta la Ley de Deméter
![Page 53: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/53.jpg)
La decisión es QUÉ testear
• Testea siempre los casos límite
• Testea las vistas puntualmente
• Testea los controladores teniendo en cuenta la Ley de Deméter
• Un controlador debería manejar sólo su propio modelo
![Page 54: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/54.jpg)
Algunas herramientas chulas
![Page 55: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/55.jpg)
Rcov
![Page 56: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/56.jpg)
Rcov
![Page 57: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/57.jpg)
Rcov
![Page 58: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/58.jpg)
Rcov
• No es la panacea
![Page 59: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/59.jpg)
Rcov
• No es la panacea
• Pero mola
![Page 60: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/60.jpg)
Rcov
• No es la panacea
• Pero mola
• Uso:
![Page 61: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/61.jpg)
Rcov
• No es la panacea
• Pero mola
• Uso:
• Gema
![Page 62: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/62.jpg)
Rcov
• No es la panacea
• Pero mola
• Uso:
• Gema
• Plugin
![Page 63: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/63.jpg)
Rcov
• No es la panacea
• Pero mola
• Uso:
• Gema
• Plugin
• Rake
![Page 64: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/64.jpg)
Ojo: el test coverage despista a veces
Combínalo con cosas como heckle (¡¡metatesting!!)
![Page 65: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/65.jpg)
Integración contínua
![Page 66: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/66.jpg)
Integración contínua
• Si tienes buenos tests, tardan un rato =;-)
![Page 67: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/67.jpg)
Integración contínua
• Si tienes buenos tests, tardan un rato =;-)
• Durante el desarrollo, sólo ejecutas los tests del código que tocas
![Page 68: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/68.jpg)
Integración contínua
• Si tienes buenos tests, tardan un rato =;-)
• Durante el desarrollo, sólo ejecutas los tests del código que tocas
• Para todo lo demás, CruiseControl.rb
![Page 69: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/69.jpg)
Integración contínua
![Page 70: Más allá del testing](https://reader034.vdocuments.site/reader034/viewer/2022050816/54b49fd34a7959b23f8b4573/html5/thumbnails/70.jpg)
¿Preguntas?