SlideShare una empresa de Scribd logo
1 de 101
Descargar para leer sin conexión
agile software development & services
Cómo escribir buenos test
al hacer TDD
www.10pines.com
Hernán Wilkinson
Twitter: @HernanWilkinson
Blog: objectmodels.blogspot.com
www.10pines.com
¿Qué es TDD?
Técnica de Aprendizaje
Iterativa e Incremental
Basada en Feedback Inmediato
Como side-effect:
Recuerda todo lo aprendido
Y permite asegurarnos de no haber
“desaprendido”
Incluye análisis, diseño, programación
y testing
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
2) Correr todos los tests
- Implementar la solución más simple que
haga pasar el/los test/s
- GOTO 2 hasta que “todos los tests” pasen
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
2) Correr todos los tests
- Implementar la solución más simple que
haga pasar el/los test/s
- GOTO 2 hasta que “todos los tests” pasen
3) Reflexiono - ¿Se puede mejorar el código?
- Sí -> Refactorizar. GOTO 2
- No -> GOTO 1
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
2) Correr todos los tests
- Implementar la solución más simple que
haga pasar el/los test/s
- GOTO 2 hasta que “todos los tests” pasen
3) Reflexiono - ¿Se puede mejorar el código?
- Sí -> Refactorizar. GOTO 2
- No -> GOTO 1
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
2) Correr todos los tests
- Implementar la solución más simple que
haga pasar el/los test/s
- GOTO 2 hasta que “todos los tests” pasen
3) Reflexiono - ¿Se puede mejorar el código?
- Sí -> Refactorizar. GOTO 2
- No -> GOTO 1
Regla 1: Si el test no
falla la primera vez que
corre es porque:
a) Estamos testeando algo
testeado
b) Nos adelantamos en el
paso 2
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
2) Correr todos los tests
- Implementar la solución más simple que
haga pasar el/los test/s
- GOTO 2 hasta que “todos los tests” pasen
3) Reflexiono - ¿Se puede mejorar el código?
- Sí -> Refactorizar. GOTO 2
- No -> GOTO 1
¿Cómo se hace TDD?
1) Escribir un test
- Debe ser el más sencillo que se nos ocurra
- Debe fallar al correrlo
2) Correr todos los tests
- Implementar la solución más simple que
haga pasar el/los test/s
- GOTO 2 hasta que “todos los tests” pasen
3) Reflexiono - ¿Se puede mejorar el código?
- Sí -> Refactorizar. GOTO 2
- No -> GOTO 1
Regla 2: Sensar el
tiempo que nos lleva
realizar cada paso
Tiempo
Si nos lleva mucho tiempo escribir el
test 
El test no es el más sencillo
¿Nos cuesta mucho crear los objetos
para la prueba? 
Hay que crear objetos que ayuden en la
creación de objetos 
El diseño del sistema no es bueno y
nos dificulta la escritura del test
Tiempo
Si nos lleva mucho tiempo hacer pasar
el test 
El test no era el más sencillo  Borrar el
test e intentar con uno más sencillo
La implementación no resuelve el
problema  ¡Debuggear!
El diseño del sistema no es bueno y
nos dificulta la implementación de
nueva funcionalidad  Hacer paso 3
para mejorar el diseño antes de
seguir
Tiempo
Los test tardan mucho tiempo en
ejecutar 
El sistema está acoplado con recursos
externos que hace que ejecute “lento”.
Ejemplo: Base de datos
Los test no verifican funcionalidad sino
performance 
Test de performance se hacen con
testing, no TDD
Tiempo
Tardo mucho en hacer refactorings 
¡Aprender refactorings automatizados!
Si están programando con editores de
texto ¡pasar a un IDE!
Aprender como hacer cambios chicos por
medio de refactorings encadenados
El diseño del sistema es muy malo, esta
muy acoplado y no queda otra que tomarse
tiempo para arreglarlo 
Estructura de los tests
Setup
Exercise
Assert
Establece el contexto inicial para la
ejecución del test. Pre-condición del test
(puede ser reificado en mensaje setUp)
Ejercita la funcionalidad específica que se
está testeando. Determina QUÉ se está
testeando.
Verifica que los resultados sean los
esperados. Post-condición del test
Ejemplo
▶ Algoritmo para calcular los factores primos de un
número entero. Debe devolver una lista con ellos
– 1 -> {} (no tiene factores primos)
– 2 -> { 2 }
– 3 -> { 3 }
– 4 -> { 2,2 }
– 5 -> { 5 }
– 6 -> { 2,3 }
– 7 -> { 7 }
– 8 -> { 2,2,2 }
– 9 -> { 3,3 }
– 10 -> { 2,5 }
– Etc
¿Cómo lo llamamos?
¿Qué tal así?
¿Entonces cómo llamamos
este?
Regla 3: Nombrar los
tests sintetizando el
setup, exercise y
assertions en una frase
Tip: Nombrar los tests cuando
hayamos avanzado en la solución
¿Cuál es el setup y exercise?
Setup
Exercise
Assert
¿Qué tal este?
No suena muy bien…
¿Cómo llamamos estos tests?
 Nombres casi iguales…
 “Nombres repetidos”
 ¡Tests del mismo caso!
¡Mismo caso funcional!
Regla 4: Nombrar los
tests en base al caso
funcional y no en base
a los datos de prueba
Tip: Dato de Prueba != Caso de Prueba
 Dato de Prueba: Ejemplos concretos que
“definen” un caso de prueba
 Caso de Prueba: Generalización que
incluye los datos de prueba
¡Me da miedo!
¿Qué pasa si …?
 Decisión complicada…
 Números primos infinitos…
 Ver la implementación
lamentablemente
Ejemplo
▶ Modelar un Calendario de días feriados al que se le pueda
preguntar si una fecha es feriado o no
▶ Se pueda indicar qué días son feriados de la siguiente
manera:
– Por medio de un día de la semana, ej. Domingo
– Por medio de un día de un mes, ej. 25 de Diciembre
– Por medio de un día particular, ej. 20/4/2012
¿Cómo lo llamamos?
 ¿Si hago un test con 3 días
pasará?
 ¿y con 4 …?
 ¿y con 7?
¡Inducción Incorrecta!
Regla 5: ¡Los tests no
son una verificación
formal!
Técnica: Testar con datos testigos
Técnica: Testar con datos bordes
¿Aserción luego del set
up?
¿Aserción luego del set
up?
Para pensar… first ?
 Separar el test en 2
¿Exercise luego de
aserción?
¿Exercise luego de
aserción?
Para pensar… first ? second?
 Separar el test en 2
Regla 6: Los tests
deben seguir la
estructura setup-
exercise-assertion
first ? second?
Pensar en “tipo” no en
implementación
Regla 7: Las aserciones
sobre colecciones no deben
acoplar a la implementación
Regla 8: Las aserciones
sobre colecciones deben
asegurar la doble inclusión
Tip: asertar size e inclusión de cada
objeto
Aserción repetidaAserción repetida
¡Reificar aserciones!
Regla 9: Los tests son
un sistema más que
hay que desarrollar y
mantener. Hacerlo
usando las mismas
reglas de diseño que el
sistema principal
Regla 10: Los tests son un
sistema que usa el sistema
principal, por lo tanto los
tests nos convierten en los
primeros usuarios del
sistema principal y nos
hacen sufrir sus problemas
¿Va a funcionar siempre?
¿Qué problema de diseño tiene
esta implementación?
¡Saco acoplamiento
parametrizando la fecha!
¡Ahora la fecha de prueba es
relativa, no absoluta!
¡Ahora va a funcionar siempre, no
importa que día sea hoy!
Regla 11: Cuando hay
dependencia entre datos de
prueba e implementación,
romper el acoplamiento
parametrizando
Tip: siempre usar datos de
prueba relativos, no absolutos
Regla 12: Nunca acoplar la
implementación con fuentes
de información ni sistemas
externos, parametrizar
Acceso via interface REST  El carrito pasa a ser
inválido (inutilizable) luego de 30 minutos de no usarlo
¿Qué principio de diseño se está
violando? ¿Cómo lo evito? ¿Qué
tiene que controlar el test?
Reloj manual para controlar
el paso del tiempo
Parametrizo cómo obtiene
la hora
Reloj manual para controlar
el paso del tiempo
Parametrizo cómo obtiene
la hora
Reloj manual para controlar
el paso del tiempo
Simulo paso del tiempo
Regla 13: El test tiene
que estar en control de
TODO
(hasta del paso del tiempo si es
necesario)
Tip: Si hay que controlar el tiempo,
simular el reloj
¿Cómo hay que testear
excepciones?
Solo la colaboración que
levanta la excepción
Solo la colaboración que
levanta la excepción
Aserto que se levantó la ex. esperada
Solo la colaboración que
levanta la excepción
Aserto que se levantó la ex. esperada
Aserto sobre la post-condición
Regla 14: Cuando se
testea por excepciones
se debe:
1) Una colaboración en el try
2) Asertar exc. correcta
3) Asertar post-condición
Tip: falta de aserción sobre post-condición
puede indicar que no estamos modelando
algo
Referencia directa a la base de datos
Referencia directa a la base de datos y cómo
se busca en ella
¿Cómo rompo este acoplamiento?
Modela un sub-sistema
Lo implementa de manera persistente
Lo implementa de manera transient
Regla 15: Modelar los
conjuntos de objetos
(sistemas)
Tip: Queda representada la arquitectura
del sistema por medio de objetos
¿Cómo defino que subsistema
usar?
Regla 16: Modelar los
ambientes de
ejecución y dejarlos
como único punto de
acceso a toda la
información
▶ Regla 1: Si el test no falla la primera vez es
porque …
▶ Regla 2: Sensar el tiempo que nos lleva
realizar cada paso
▶ Regla 3: Nombrar los tests sintetizando el
setup, exercise y assertions en una frase
▶ Regla 4: Nombrar los tests en base al caso
funcional y no en base a los datos de prueba
Conclusiones
▶ Regla 5: ¡Los tests no son una verificación
formal!
▶ Regla 6: Los tests deben seguir la estructura
setup-exercise-assertion
▶ Regla 7: Las aserciones sobre colecciones no
deben acoplar a la implementación
▶ Regla 8: Las aserciones sobre colecciones
deben asegurar la doble inclusión
Conclusiones
▶ Regla 9: Los tests son un sistema más que hay
que desarrollar y mantener …
▶ Regla 10: … los tests nos convierten en los
primeros usuarios del sistema …
▶ Regla 11: … romper el acoplamiento
parametrizando
▶ Regla 12: Nunca acoplar la implementación
con fuentes de información ni sistemas
externos, parametrizar
Conclusiones
▶ Regla 13: El test tiene que estar en control de
TODO
▶ Regla 14: Cuando se testea por excepciones se
debe …
▶ Regla 15: Modelar los conjuntos de objetos
(sistemas)
▶ Regla 16: Modelar los ambientes de ejecución
y dejarlos como único punto de acceso a toda
la información
Conclusiones
agile software development & services
Muchas gracias!
info@10pines.com
www.10Pines.com
twitter: @10Pines
Argentina
Tel.: +54 (11) 6091-3125
Av. Alem 693, 5B
(1001) Buenos Aires

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Desarrollo Guiado Por Pruebas
Desarrollo Guiado Por PruebasDesarrollo Guiado Por Pruebas
Desarrollo Guiado Por Pruebas
 
TDD Course (Spanish)
TDD Course (Spanish)TDD Course (Spanish)
TDD Course (Spanish)
 
Introducción a TDD
Introducción a TDDIntroducción a TDD
Introducción a TDD
 
Stop the agile micro-management
Stop the agile micro-managementStop the agile micro-management
Stop the agile micro-management
 
Pruebas Unitarias
Pruebas UnitariasPruebas Unitarias
Pruebas Unitarias
 
No debuggearás - Introducción al Unit Testing y TDD
No debuggearás - Introducción al Unit Testing y TDDNo debuggearás - Introducción al Unit Testing y TDD
No debuggearás - Introducción al Unit Testing y TDD
 
Unit Testing en iOS
Unit Testing en iOSUnit Testing en iOS
Unit Testing en iOS
 
ATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de AceptaciónATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de Aceptación
 
Conceptos básicos de Unit Test
Conceptos básicos de Unit Test Conceptos básicos de Unit Test
Conceptos básicos de Unit Test
 
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
 
Charla evento TestingUY 2017 - Automatización en gran escala
Charla evento TestingUY 2017 - Automatización en gran escalaCharla evento TestingUY 2017 - Automatización en gran escala
Charla evento TestingUY 2017 - Automatización en gran escala
 
Pedro sebastián mingo. peopleware en el testing
Pedro sebastián mingo. peopleware en el testingPedro sebastián mingo. peopleware en el testing
Pedro sebastián mingo. peopleware en el testing
 
Presentación Agile Testing
Presentación Agile TestingPresentación Agile Testing
Presentación Agile Testing
 
Pruebas Unitarias
Pruebas Unitarias Pruebas Unitarias
Pruebas Unitarias
 
[ES] webcat 2014-03 Demystifying Development Techniques
[ES] webcat 2014-03 Demystifying Development Techniques[ES] webcat 2014-03 Demystifying Development Techniques
[ES] webcat 2014-03 Demystifying Development Techniques
 
Baby steps to tdd
Baby steps to tddBaby steps to tdd
Baby steps to tdd
 
TDD Code Retreat
TDD Code RetreatTDD Code Retreat
TDD Code Retreat
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
 
Lima agile day tdd con visual studio 2010
Lima agile day   tdd con visual studio 2010Lima agile day   tdd con visual studio 2010
Lima agile day tdd con visual studio 2010
 
Enrique Sánchez. Cómo ser un agile tester (y no morir intentándolo)
Enrique Sánchez. Cómo ser un agile tester (y no morir intentándolo)Enrique Sánchez. Cómo ser un agile tester (y no morir intentándolo)
Enrique Sánchez. Cómo ser un agile tester (y no morir intentándolo)
 

Destacado

Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...
Hernan Wilkinson
 
How to integrate UX in your Product sprints (Agiles 2016)
How to integrate UX in your Product sprints (Agiles 2016)How to integrate UX in your Product sprints (Agiles 2016)
How to integrate UX in your Product sprints (Agiles 2016)
Unai Roldán
 
Introducción a Agile y Scrum
Introducción a Agile y ScrumIntroducción a Agile y Scrum
Introducción a Agile y Scrum
Johnny Ordóñez
 

Destacado (20)

Desarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agilesDesarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agiles
 
Growing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust companyGrowing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust company
 
Augmenting Smalltalk Syntax
Augmenting Smalltalk SyntaxAugmenting Smalltalk Syntax
Augmenting Smalltalk Syntax
 
A new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendarA new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendar
 
Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...
 
Los diez mandamientos de TDD
Los diez mandamientos de TDDLos diez mandamientos de TDD
Los diez mandamientos de TDD
 
Programming Languages and their influence in Thinking
Programming Languages and their influence in ThinkingProgramming Languages and their influence in Thinking
Programming Languages and their influence in Thinking
 
How to integrate UX in your Product sprints (Agiles 2016)
How to integrate UX in your Product sprints (Agiles 2016)How to integrate UX in your Product sprints (Agiles 2016)
How to integrate UX in your Product sprints (Agiles 2016)
 
Programming Language Technical debt and their influence in Thinking and Desgin
Programming Language Technical debt and their influence in Thinking and DesginProgramming Language Technical debt and their influence in Thinking and Desgin
Programming Language Technical debt and their influence in Thinking and Desgin
 
Confianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresaConfianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresa
 
Arithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languagesArithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languages
 
Objects: The Misunderstood Paradigm
Objects: The Misunderstood ParadigmObjects: The Misunderstood Paradigm
Objects: The Misunderstood Paradigm
 
Obejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCMObejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCM
 
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interaccionesFacilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
 
Introducción a Agile y Scrum
Introducción a Agile y ScrumIntroducción a Agile y Scrum
Introducción a Agile y Scrum
 
Things programmers know
Things programmers knowThings programmers know
Things programmers know
 
Code metrics in PHP
Code metrics in PHPCode metrics in PHP
Code metrics in PHP
 
Think Like a Programmer
Think Like a ProgrammerThink Like a Programmer
Think Like a Programmer
 
Stop the agile micro-management
Stop the agile micro-managementStop the agile micro-management
Stop the agile micro-management
 
5 principios Lean - @pablitux #LeanFestNight 2016
5 principios Lean - @pablitux #LeanFestNight 20165 principios Lean - @pablitux #LeanFestNight 2016
5 principios Lean - @pablitux #LeanFestNight 2016
 

Similar a Como escribir buenos tests al hacer TDD

Aguirre Jimenez
Aguirre JimenezAguirre Jimenez
Aguirre Jimenez
FARIDROJAS
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu Startup
Martin Siniawski
 

Similar a Como escribir buenos tests al hacer TDD (20)

Artalde Tdd intro
Artalde Tdd introArtalde Tdd intro
Artalde Tdd intro
 
Vuelta_a_los_origines_Testing.pdf
Vuelta_a_los_origines_Testing.pdfVuelta_a_los_origines_Testing.pdf
Vuelta_a_los_origines_Testing.pdf
 
Seminario de Test Development Driven
Seminario de Test Development DrivenSeminario de Test Development Driven
Seminario de Test Development Driven
 
S9-DAW-2022S1.pptx
S9-DAW-2022S1.pptxS9-DAW-2022S1.pptx
S9-DAW-2022S1.pptx
 
7iSF-4 test driver development
7iSF-4   test driver development7iSF-4   test driver development
7iSF-4 test driver development
 
Test unitarios
Test unitariosTest unitarios
Test unitarios
 
Aguirre Jimenez
Aguirre JimenezAguirre Jimenez
Aguirre Jimenez
 
Introducción a tdd
Introducción a tddIntroducción a tdd
Introducción a tdd
 
Buenasprcticas
BuenasprcticasBuenasprcticas
Buenasprcticas
 
Pruebas de software
Pruebas de softwarePruebas de software
Pruebas de software
 
Testing "a dormir tranquilos"
Testing "a dormir tranquilos"Testing "a dormir tranquilos"
Testing "a dormir tranquilos"
 
Unidad ii. tdd
Unidad ii. tddUnidad ii. tdd
Unidad ii. tdd
 
Calidad del software cap3
Calidad del software   cap3Calidad del software   cap3
Calidad del software cap3
 
Meetup: Sesion #1 Unit Testing & Simian Army
Meetup: Sesion #1 Unit Testing & Simian ArmyMeetup: Sesion #1 Unit Testing & Simian Army
Meetup: Sesion #1 Unit Testing & Simian Army
 
Cypress en un mundo lleno de Selenium
Cypress en un mundo lleno de SeleniumCypress en un mundo lleno de Selenium
Cypress en un mundo lleno de Selenium
 
Introduction to unit testing
Introduction to unit testingIntroduction to unit testing
Introduction to unit testing
 
Doble o nada
Doble o nadaDoble o nada
Doble o nada
 
Qunit CookBook español
Qunit CookBook españolQunit CookBook español
Qunit CookBook español
 
Taller de Simpletest - Drupal Day Valencia 2012
Taller de Simpletest - Drupal Day Valencia 2012Taller de Simpletest - Drupal Day Valencia 2012
Taller de Simpletest - Drupal Day Valencia 2012
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu Startup
 

Más de Hernan Wilkinson

Más de Hernan Wilkinson (18)

Hacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con softwareHacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con software
 
Live Typing - California Smalltalkers
Live Typing - California SmalltalkersLive Typing - California Smalltalkers
Live Typing - California Smalltalkers
 
Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020
 
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicosLiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
 
LiveTyping: Update and What is next
LiveTyping: Update and What is nextLiveTyping: Update and What is next
LiveTyping: Update and What is next
 
Cuis smalltalk past present and future
Cuis smalltalk past present and futureCuis smalltalk past present and future
Cuis smalltalk past present and future
 
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
Live Typing- Automatic Type Annotation that improves the Programming eXperie...Live Typing- Automatic Type Annotation that improves the Programming eXperie...
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
 
El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018
 
Lessons Learned Implementing Refactorings
Lessons Learned Implementing RefactoringsLessons Learned Implementing Refactorings
Lessons Learned Implementing Refactorings
 
Dynamic Type Information
Dynamic Type InformationDynamic Type Information
Dynamic Type Information
 
El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018
 
El Desarrollo de Software como debería Ser
El Desarrollo de Software como debería SerEl Desarrollo de Software como debería Ser
El Desarrollo de Software como debería Ser
 
TDD & Refactoring
TDD & RefactoringTDD & Refactoring
TDD & Refactoring
 
Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?
 
Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!
 
CuisUniversity
CuisUniversityCuisUniversity
CuisUniversity
 
Oop is not Dead
Oop is not DeadOop is not Dead
Oop is not Dead
 
Cómo Java afecta nuestros Diseños
Cómo Java afecta nuestros DiseñosCómo Java afecta nuestros Diseños
Cómo Java afecta nuestros Diseños
 

Como escribir buenos tests al hacer TDD

  • 1. agile software development & services Cómo escribir buenos test al hacer TDD www.10pines.com Hernán Wilkinson Twitter: @HernanWilkinson Blog: objectmodels.blogspot.com www.10pines.com
  • 2. ¿Qué es TDD? Técnica de Aprendizaje Iterativa e Incremental Basada en Feedback Inmediato Como side-effect: Recuerda todo lo aprendido Y permite asegurarnos de no haber “desaprendido” Incluye análisis, diseño, programación y testing
  • 3. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo
  • 4. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo 2) Correr todos los tests - Implementar la solución más simple que haga pasar el/los test/s - GOTO 2 hasta que “todos los tests” pasen
  • 5. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo 2) Correr todos los tests - Implementar la solución más simple que haga pasar el/los test/s - GOTO 2 hasta que “todos los tests” pasen 3) Reflexiono - ¿Se puede mejorar el código? - Sí -> Refactorizar. GOTO 2 - No -> GOTO 1
  • 6. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo 2) Correr todos los tests - Implementar la solución más simple que haga pasar el/los test/s - GOTO 2 hasta que “todos los tests” pasen 3) Reflexiono - ¿Se puede mejorar el código? - Sí -> Refactorizar. GOTO 2 - No -> GOTO 1
  • 7. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo 2) Correr todos los tests - Implementar la solución más simple que haga pasar el/los test/s - GOTO 2 hasta que “todos los tests” pasen 3) Reflexiono - ¿Se puede mejorar el código? - Sí -> Refactorizar. GOTO 2 - No -> GOTO 1
  • 8. Regla 1: Si el test no falla la primera vez que corre es porque: a) Estamos testeando algo testeado b) Nos adelantamos en el paso 2
  • 9. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo 2) Correr todos los tests - Implementar la solución más simple que haga pasar el/los test/s - GOTO 2 hasta que “todos los tests” pasen 3) Reflexiono - ¿Se puede mejorar el código? - Sí -> Refactorizar. GOTO 2 - No -> GOTO 1
  • 10. ¿Cómo se hace TDD? 1) Escribir un test - Debe ser el más sencillo que se nos ocurra - Debe fallar al correrlo 2) Correr todos los tests - Implementar la solución más simple que haga pasar el/los test/s - GOTO 2 hasta que “todos los tests” pasen 3) Reflexiono - ¿Se puede mejorar el código? - Sí -> Refactorizar. GOTO 2 - No -> GOTO 1
  • 11. Regla 2: Sensar el tiempo que nos lleva realizar cada paso
  • 12. Tiempo Si nos lleva mucho tiempo escribir el test  El test no es el más sencillo ¿Nos cuesta mucho crear los objetos para la prueba?  Hay que crear objetos que ayuden en la creación de objetos  El diseño del sistema no es bueno y nos dificulta la escritura del test
  • 13. Tiempo Si nos lleva mucho tiempo hacer pasar el test  El test no era el más sencillo  Borrar el test e intentar con uno más sencillo La implementación no resuelve el problema  ¡Debuggear! El diseño del sistema no es bueno y nos dificulta la implementación de nueva funcionalidad  Hacer paso 3 para mejorar el diseño antes de seguir
  • 14. Tiempo Los test tardan mucho tiempo en ejecutar  El sistema está acoplado con recursos externos que hace que ejecute “lento”. Ejemplo: Base de datos Los test no verifican funcionalidad sino performance  Test de performance se hacen con testing, no TDD
  • 15. Tiempo Tardo mucho en hacer refactorings  ¡Aprender refactorings automatizados! Si están programando con editores de texto ¡pasar a un IDE! Aprender como hacer cambios chicos por medio de refactorings encadenados El diseño del sistema es muy malo, esta muy acoplado y no queda otra que tomarse tiempo para arreglarlo 
  • 16. Estructura de los tests Setup Exercise Assert Establece el contexto inicial para la ejecución del test. Pre-condición del test (puede ser reificado en mensaje setUp) Ejercita la funcionalidad específica que se está testeando. Determina QUÉ se está testeando. Verifica que los resultados sean los esperados. Post-condición del test
  • 17. Ejemplo ▶ Algoritmo para calcular los factores primos de un número entero. Debe devolver una lista con ellos – 1 -> {} (no tiene factores primos) – 2 -> { 2 } – 3 -> { 3 } – 4 -> { 2,2 } – 5 -> { 5 } – 6 -> { 2,3 } – 7 -> { 7 } – 8 -> { 2,2,2 } – 9 -> { 3,3 } – 10 -> { 2,5 } – Etc
  • 21. Regla 3: Nombrar los tests sintetizando el setup, exercise y assertions en una frase Tip: Nombrar los tests cuando hayamos avanzado en la solución
  • 22. ¿Cuál es el setup y exercise?
  • 23.
  • 24. Setup
  • 28. No suena muy bien…
  • 29.
  • 31.
  • 32.  Nombres casi iguales…  “Nombres repetidos”  ¡Tests del mismo caso!
  • 34. Regla 4: Nombrar los tests en base al caso funcional y no en base a los datos de prueba
  • 35. Tip: Dato de Prueba != Caso de Prueba  Dato de Prueba: Ejemplos concretos que “definen” un caso de prueba  Caso de Prueba: Generalización que incluye los datos de prueba
  • 36. ¡Me da miedo! ¿Qué pasa si …?
  • 37.
  • 38.  Decisión complicada…  Números primos infinitos…  Ver la implementación lamentablemente
  • 39. Ejemplo ▶ Modelar un Calendario de días feriados al que se le pueda preguntar si una fecha es feriado o no ▶ Se pueda indicar qué días son feriados de la siguiente manera: – Por medio de un día de la semana, ej. Domingo – Por medio de un día de un mes, ej. 25 de Diciembre – Por medio de un día particular, ej. 20/4/2012
  • 41.
  • 42.
  • 43.  ¿Si hago un test con 3 días pasará?  ¿y con 4 …?  ¿y con 7?
  • 45. Regla 5: ¡Los tests no son una verificación formal! Técnica: Testar con datos testigos Técnica: Testar con datos bordes
  • 47. ¿Aserción luego del set up? Para pensar… first ?
  • 48.  Separar el test en 2
  • 50. ¿Exercise luego de aserción? Para pensar… first ? second?
  • 51.  Separar el test en 2
  • 52. Regla 6: Los tests deben seguir la estructura setup- exercise-assertion
  • 54. Pensar en “tipo” no en implementación
  • 55. Regla 7: Las aserciones sobre colecciones no deben acoplar a la implementación Regla 8: Las aserciones sobre colecciones deben asegurar la doble inclusión Tip: asertar size e inclusión de cada objeto
  • 58. Regla 9: Los tests son un sistema más que hay que desarrollar y mantener. Hacerlo usando las mismas reglas de diseño que el sistema principal
  • 59. Regla 10: Los tests son un sistema que usa el sistema principal, por lo tanto los tests nos convierten en los primeros usuarios del sistema principal y nos hacen sufrir sus problemas
  • 60.
  • 61.
  • 62.
  • 63. ¿Va a funcionar siempre?
  • 64. ¿Qué problema de diseño tiene esta implementación?
  • 66. ¡Ahora la fecha de prueba es relativa, no absoluta!
  • 67. ¡Ahora va a funcionar siempre, no importa que día sea hoy!
  • 68. Regla 11: Cuando hay dependencia entre datos de prueba e implementación, romper el acoplamiento parametrizando Tip: siempre usar datos de prueba relativos, no absolutos
  • 69. Regla 12: Nunca acoplar la implementación con fuentes de información ni sistemas externos, parametrizar
  • 70. Acceso via interface REST  El carrito pasa a ser inválido (inutilizable) luego de 30 minutos de no usarlo
  • 71.
  • 72. ¿Qué principio de diseño se está violando? ¿Cómo lo evito? ¿Qué tiene que controlar el test?
  • 73.
  • 74. Reloj manual para controlar el paso del tiempo
  • 75. Parametrizo cómo obtiene la hora Reloj manual para controlar el paso del tiempo
  • 76. Parametrizo cómo obtiene la hora Reloj manual para controlar el paso del tiempo Simulo paso del tiempo
  • 77. Regla 13: El test tiene que estar en control de TODO (hasta del paso del tiempo si es necesario) Tip: Si hay que controlar el tiempo, simular el reloj
  • 78. ¿Cómo hay que testear excepciones?
  • 79. Solo la colaboración que levanta la excepción
  • 80. Solo la colaboración que levanta la excepción Aserto que se levantó la ex. esperada
  • 81. Solo la colaboración que levanta la excepción Aserto que se levantó la ex. esperada Aserto sobre la post-condición
  • 82. Regla 14: Cuando se testea por excepciones se debe: 1) Una colaboración en el try 2) Asertar exc. correcta 3) Asertar post-condición Tip: falta de aserción sobre post-condición puede indicar que no estamos modelando algo
  • 83.
  • 84. Referencia directa a la base de datos
  • 85. Referencia directa a la base de datos y cómo se busca en ella ¿Cómo rompo este acoplamiento?
  • 87. Lo implementa de manera persistente
  • 88. Lo implementa de manera transient
  • 89. Regla 15: Modelar los conjuntos de objetos (sistemas) Tip: Queda representada la arquitectura del sistema por medio de objetos
  • 90. ¿Cómo defino que subsistema usar?
  • 91.
  • 92.
  • 93.
  • 94.
  • 95. Regla 16: Modelar los ambientes de ejecución y dejarlos como único punto de acceso a toda la información
  • 96. ▶ Regla 1: Si el test no falla la primera vez es porque … ▶ Regla 2: Sensar el tiempo que nos lleva realizar cada paso ▶ Regla 3: Nombrar los tests sintetizando el setup, exercise y assertions en una frase ▶ Regla 4: Nombrar los tests en base al caso funcional y no en base a los datos de prueba Conclusiones
  • 97. ▶ Regla 5: ¡Los tests no son una verificación formal! ▶ Regla 6: Los tests deben seguir la estructura setup-exercise-assertion ▶ Regla 7: Las aserciones sobre colecciones no deben acoplar a la implementación ▶ Regla 8: Las aserciones sobre colecciones deben asegurar la doble inclusión Conclusiones
  • 98. ▶ Regla 9: Los tests son un sistema más que hay que desarrollar y mantener … ▶ Regla 10: … los tests nos convierten en los primeros usuarios del sistema … ▶ Regla 11: … romper el acoplamiento parametrizando ▶ Regla 12: Nunca acoplar la implementación con fuentes de información ni sistemas externos, parametrizar Conclusiones
  • 99. ▶ Regla 13: El test tiene que estar en control de TODO ▶ Regla 14: Cuando se testea por excepciones se debe … ▶ Regla 15: Modelar los conjuntos de objetos (sistemas) ▶ Regla 16: Modelar los ambientes de ejecución y dejarlos como único punto de acceso a toda la información Conclusiones
  • 100.
  • 101. agile software development & services Muchas gracias! info@10pines.com www.10Pines.com twitter: @10Pines Argentina Tel.: +54 (11) 6091-3125 Av. Alem 693, 5B (1001) Buenos Aires