Más allá del testing

71
Más allá del testing Sergio Gil Christos Zisopoulos

description

Ponencia sobre buenas prácticas de testing en la Conferencia Rails '2007 (Madrid 22 y 23 de noviembre), por Sergio Gil y Christos Zisopoulos

Transcript of Más allá del testing

Page 1: Más allá del testing

Más allá del testingSergio Gil

Christos Zisopoulos

Page 2: Más allá del testing

Estrategias de testing

Page 3: Más allá del testing

DDT: Development Driven Testing

Page 4: Más allá del testing

DDT: Development Driven Testing

Escribir los tests después de la primera iteración

del código

Page 5: Más allá del testing

Por qué

Page 6: Más allá del testing

Por qué

• A veces la especificación no existe es difusa, y hay poco tiempo

Page 7: Más allá del testing

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

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

Por qué

Page 10: Más allá del testing

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

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

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

TDD: Test Driven Development

Page 14: Más allá del testing

TDD: Test Driven Development

Escribir los tests antes de implementar

el código

Page 15: Más allá del testing

Por qué

Page 16: Más allá del testing

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

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

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

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

BDD: Behaviour Driven Testing

Page 21: Más allá del testing

BDD: Behaviour Driven Testing

Escribir, antes de implementar, especificaciones que luego

sirvan para testear

Page 22: Más allá del testing

Por qué

Page 23: Más allá del testing

Por qué

• Es descriptivo

Page 24: Más allá del testing

Por qué

• Es descriptivo

• Sirve de documentación (es legible por humanos normales)

Page 25: Más allá del testing

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

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

Patrones y buenas prácticas

Page 28: Más allá del testing

El buen código es fácil de testear

Page 29: Más allá del testing

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

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

Números mágicos

Page 32: Más allá del testing

Números mágicos

• Hasta 7 acciones por controlador

Page 33: Más allá del testing

Números mágicos

• Hasta 7 acciones por controlador

• Hasta 10 líneas por acción

Page 34: Más allá del testing

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

Ley de Deméter

Page 36: Más allá del testing

Ley de Deméter

• “Habla sólo con tus inmediatos amigos”

Page 37: Más allá del testing

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

post.comments.map(&:owner).map(&:email)post.comments.map(&:owner_email)post.commentator_emails

Page 39: Más allá del testing

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

# 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

# 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

@@valid_model_attributes

Page 43: Más allá del testing

@@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

@@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

La decisión es QUÉ testear

Page 46: Más allá del testing

La decisión es QUÉ testear

• No testees ActiveRecord

Page 47: Más allá del testing

La decisión es QUÉ testear

• No testees ActiveRecord

• Testea las validaciones

Page 48: Más allá del testing

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

La decisión es QUÉ testear

Page 50: Más allá del testing

La decisión es QUÉ testear

• Testea siempre los casos límite

Page 51: Más allá del testing

La decisión es QUÉ testear

• Testea siempre los casos límite

• Testea las vistas puntualmente

Page 52: Más allá del testing

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

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

Algunas herramientas chulas

Page 55: Más allá del testing

Rcov

Page 56: Más allá del testing

Rcov

Page 57: Más allá del testing

Rcov

Page 58: Más allá del testing

Rcov

• No es la panacea

Page 59: Más allá del testing

Rcov

• No es la panacea

• Pero mola

Page 60: Más allá del testing

Rcov

• No es la panacea

• Pero mola

• Uso:

Page 61: Más allá del testing

Rcov

• No es la panacea

• Pero mola

• Uso:

• Gema

Page 62: Más allá del testing

Rcov

• No es la panacea

• Pero mola

• Uso:

• Gema

• Plugin

Page 63: Más allá del testing

Rcov

• No es la panacea

• Pero mola

• Uso:

• Gema

• Plugin

• Rake

Page 64: Más allá del testing

Ojo: el test coverage despista a veces

Combínalo con cosas como heckle (¡¡metatesting!!)

Page 65: Más allá del testing

Integración contínua

Page 66: Más allá del testing

Integración contínua

• Si tienes buenos tests, tardan un rato =;-)

Page 67: Más allá del testing

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

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

Integración contínua

Page 70: Más allá del testing

¿Preguntas?