Este documento presenta una agenda para una presentación sobre técnicas avanzadas de programación. La presentación cubre principios de diseño como ocultación de información, objetos y SOLID, así como técnicas de testing. Explica conceptos como componentización, limitaciones del diseño basado en ocultación de información, y cada uno de los principios SOLID con ejemplos.
1. T´ecnicas avanzadas de programaci´on
. . . o como hacer software sin morir en el intento
Jos´e Luis Diaz
26 de junio de 2014
Jos´e Luis Diaz 26 de junio de 2014 1 / 80
2. Principios de dise˜no
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 2 / 80
3. Principios de dise˜no Ocultaci´on de la informaci´on
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 3 / 80
4. Principios de dise˜no Ocultaci´on de la informaci´on
Dise˜no
¿Por que dise˜nar?
Jos´e Luis Diaz 26 de junio de 2014 4 / 80
5. Principios de dise˜no Ocultaci´on de la informaci´on
Dise˜no
¿Por que dise˜nar?
Incorporar nuevos requerimientos evitando que el dise˜no se degrade.
Jos´e Luis Diaz 26 de junio de 2014 4 / 80
6. Principios de dise˜no Ocultaci´on de la informaci´on
Dise˜no
¿Por que dise˜nar?
Incorporar nuevos requerimientos evitando que el dise˜no se degrade.
Los cambios puedan incorporarse con el menor costo posible.
Jos´e Luis Diaz 26 de junio de 2014 4 / 80
7. Principios de dise˜no Ocultaci´on de la informaci´on
Dise˜no
¿Por que dise˜nar?
Incorporar nuevos requerimientos evitando que el dise˜no se degrade.
Los cambios puedan incorporarse con el menor costo posible.
Hacer el caso com´un f´acil, el caso complejo posible (Joshua Blosh
sobre los lenguajes)
Jos´e Luis Diaz 26 de junio de 2014 4 / 80
8. Principios de dise˜no Ocultaci´on de la informaci´on
Parnas
Una metodolog´ıa para componentizar (Parnas, David a principio de los ’70)
Jos´e Luis Diaz 26 de junio de 2014 5 / 80
9. Principios de dise˜no Ocultaci´on de la informaci´on
Parnas
Una metodolog´ıa para componentizar (Parnas, David a principio de los ’70)
Identificar potenciales componentes. Detectar desde los
requerimientos los que mas vayan a cambiar.
Jos´e Luis Diaz 26 de junio de 2014 5 / 80
10. Principios de dise˜no Ocultaci´on de la informaci´on
Parnas
Una metodolog´ıa para componentizar (Parnas, David a principio de los ’70)
Identificar potenciales componentes. Detectar desde los
requerimientos los que mas vayan a cambiar.
Se contraen y expanden los requerimientos de estos componentes.
Jos´e Luis Diaz 26 de junio de 2014 5 / 80
11. Principios de dise˜no Ocultaci´on de la informaci´on
Parnas
Una metodolog´ıa para componentizar (Parnas, David a principio de los ’70)
Identificar potenciales componentes. Detectar desde los
requerimientos los que mas vayan a cambiar.
Se contraen y expanden los requerimientos de estos componentes.
Aislar estos componentes y generar interfaces que toleren estos
cambios anticipados.
Jos´e Luis Diaz 26 de junio de 2014 5 / 80
12. Principios de dise˜no Hacia los objetos
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 6 / 80
13. Principios de dise˜no Hacia los objetos
Limitaciones
Limitaciones del dise˜no basado en ocultaci´on de informaci´on.
Jos´e Luis Diaz 26 de junio de 2014 7 / 80
14. Principios de dise˜no Hacia los objetos
Limitaciones
Limitaciones del dise˜no basado en ocultaci´on de informaci´on.
Incluir todos los metodos de la interfaz de un modulo correspondiente
como un par´ametro.
Jos´e Luis Diaz 26 de junio de 2014 7 / 80
15. Principios de dise˜no Hacia los objetos
Limitaciones
Limitaciones del dise˜no basado en ocultaci´on de informaci´on.
Incluir todos los metodos de la interfaz de un modulo correspondiente
como un par´ametro.
Generar varios modulos iguales.
Jos´e Luis Diaz 26 de junio de 2014 7 / 80
16. Principios de dise˜no Hacia los objetos
Limitaciones
Limitaciones del dise˜no basado en ocultaci´on de informaci´on.
Incluir todos los metodos de la interfaz de un modulo correspondiente
como un par´ametro.
Generar varios modulos iguales.
Poder tener varias implementaciones diferentes de un mismo modulo
y poder intercambiarlos.
Jos´e Luis Diaz 26 de junio de 2014 7 / 80
17. SOLID
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 8 / 80
18. SOLID Single responsibility principle
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 9 / 80
19. SOLID Single responsibility principle
Cada clase debe tener una ´unica responsabilidad, y que esta debe ser
completamente ocultada por la clase (o modulo).
Jos´e Luis Diaz 26 de junio de 2014 10 / 80
20. SOLID Single responsibility principle
Cada clase debe tener una ´unica responsabilidad, y que esta debe ser
completamente ocultada por la clase (o modulo).
Este principio fue originalmente descripto como “cohesi´on”, la
relaci´on funcional de los elementos de una clase.
Jos´e Luis Diaz 26 de junio de 2014 10 / 80
21. SOLID Single responsibility principle
¿Por qu´e es importante este principio?
Jos´e Luis Diaz 26 de junio de 2014 11 / 80
22. SOLID Single responsibility principle
¿Por qu´e es importante este principio?
Si una clase tiene m´as de una responsabilidad, entonces las
responsabilidades est´an acopladas.
Jos´e Luis Diaz 26 de junio de 2014 11 / 80
23. SOLID Single responsibility principle
¿Por qu´e es importante este principio?
Si una clase tiene m´as de una responsabilidad, entonces las
responsabilidades est´an acopladas.
Los cambios en una de las responsabilidades pueden alterar o inhibir
la capacidad de la clase para cumplir con las otras.
Jos´e Luis Diaz 26 de junio de 2014 11 / 80
24. SOLID Single responsibility principle
¿Por qu´e es importante este principio?
Si una clase tiene m´as de una responsabilidad, entonces las
responsabilidades est´an acopladas.
Los cambios en una de las responsabilidades pueden alterar o inhibir
la capacidad de la clase para cumplir con las otras.
Este tipo de acoplamiento conduce a dise˜nos fr´agiles que se rompen
de manera inesperada cuando las clases cambian.
Jos´e Luis Diaz 26 de junio de 2014 11 / 80
25. SOLID Single responsibility principle
Aplicación de
geometría
computacional
Aplicación gráfica
GUI
Rectángulo
+ dibujar()
+ area(): double
Jos´e Luis Diaz 26 de junio de 2014 12 / 80
26. SOLID Single responsibility principle
Aplicación de
geometría
computacional
Aplicación gráficaGUI
Rectángulo
+ dibujar()
RectánguloGeométrico
+ area(): double
Jos´e Luis Diaz 26 de junio de 2014 13 / 80
27. SOLID Open-closed principle
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 14 / 80
28. SOLID Open-closed principle
Open-closed principle
Primera ves enunciada por Ivar Jacobson y luego reexpresada por
Bertran Meyer en “Object Oriented Software Construction”:
“Las entidades de software (clases, modulos, funciones, etc). Deben
estar abiertas para extensi´on, pero cerradas para modificaci´on”
Jos´e Luis Diaz 26 de junio de 2014 15 / 80
29. SOLID Open-closed principle
Open-closed principle
Primera ves enunciada por Ivar Jacobson y luego reexpresada por
Bertran Meyer en “Object Oriented Software Construction”:
“Las entidades de software (clases, modulos, funciones, etc). Deben
estar abiertas para extensi´on, pero cerradas para modificaci´on”
Esforzarse para hacer que cuando el codigo cambie, solo lugar en un
lugar.
Jos´e Luis Diaz 26 de junio de 2014 15 / 80
30. SOLID Open-closed principle
1 class Cuadrado { public double lado; }
2 class Circle { public double radio; }
3
4 class GUI {
5 Object[] figuras;
6
7 public void refresh() {
8 for (Object figura: figuras) {
9 if (figura instanceof Cuadrado) {
0 dibujarCuadrado(((Cuadrado) figura).lado);
1 }
2 else if (figura instanceof Circle) {
3 dibujarCirculo(((Circle) figura).radio);
4 }
5 }
6 }
7
8 private void dibujarCirculo(double radio) {}
9 private void dibujarCuadrado(double lado) {}
0 }
Jos´e Luis Diaz 26 de junio de 2014 16 / 80
31. SOLID Open-closed principle
1 interface Dibujable { public void dibujar(); }
2 class Cuadrado implements Dibujable { public double lado; }
3
4 class Circle implements Dibujable { public double radio; }
5
6 class GUI {
7 List<Dibujable> figuras;
8
9 public void refresh() {
0 for (Dibujable figura: figuras) {
1 figura.dibujar()
2 }
3 }
4
5 }
Jos´e Luis Diaz 26 de junio de 2014 17 / 80
32. SOLID Liskov substitution principle
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 18 / 80
33. SOLID Liskov substitution principle
Liskov substitution principle
Propiedad
Propiedad de sustituci´on: Si para cada objeto o1 de tipo S hay un objeto
o2 de tipo T tal que: para todo programa P que se define en t´erminos de
T, el comportamiento de P no varia cuando o1 es sustituido por o2
entonces S es un subtipo de T.
Jos´e Luis Diaz 26 de junio de 2014 19 / 80
34. SOLID Liskov substitution principle
Una clara violaci´on del principio:
1 void dibujar(Figura f) {
2 if (figura instanceof Cuadrado) {
3 dibujarCuadrado(((Cuadrado) figura).lado);
4 }
5 else if (figura instanceof Circle) {
6 dibujarCirculo(((Circle) figura).radio);
7 }
8 }
Jos´e Luis Diaz 26 de junio de 2014 20 / 80
35. SOLID Liskov substitution principle
El array en Java es covariante
1 String[] strings = new String[1];
2 Object[] objects = strings;
3 objects[0] = 1; // WAT!
Las Listas son invariantes.
4 List<String> ys = new LinkedList<String>();
5 ys.add("zero"); ys.add("one");
6 List<Object> a = yy // Error compilando
7 String y = ys.iterator().next();
Jos´e Luis Diaz 26 de junio de 2014 20 / 80
36. SOLID Interface segregation principle
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 21 / 80
37. SOLID Interface segregation principle
Interface segregation principle
Propiedad
Ning´un cliente tiene que ser forzado a depender de metodos que no utiliza.
Jos´e Luis Diaz 26 de junio de 2014 22 / 80
38. SOLID Interface segregation principle
1 interface Door {
2 public void lock();
3 public void unlock();
4 public boolean isDoorOpen();
5 }
6
7 class Timer {
8 public void Regsiter(int timeout, TimerClient client) {}
9 }
0
1 interface TimerClient {
2 public void timeOut();
3 }
Jos´e Luis Diaz 26 de junio de 2014 23 / 80
39. SOLID Interface segregation principle
TimerClient
Door TimedDoor
Jos´e Luis Diaz 26 de junio de 2014 24 / 80
40. SOLID Interface segregation principle
Door
TimedDoor DoorTimerAdapter
TimerClient
Jos´e Luis Diaz 26 de junio de 2014 25 / 80
41. SOLID Interface segregation principle
1 class TimedDoor extends Door {
2 void doorTimeOut() { }
3 }
4
5 class DoorTimerAdapter implements TimerClient {
6
7 private TimedDoor timedDoor;
8
9 public DoorTimerAdapter(TimedDoor door) {
0
1 }
2
3 void TimeOut(int timeOutId) {
4 timedDoor.doorTimeOut();
5 }
6
7 }
Jos´e Luis Diaz 26 de junio de 2014 26 / 80
42. SOLID Dependency inversion principle
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 27 / 80
43. SOLID Dependency inversion principle
Dependency inversion principle
Propiedad
Deber´ıamos depender de Abstracciones y no de implenentaciones.
Jos´e Luis Diaz 26 de junio de 2014 28 / 80
44. SOLID Dependency inversion principle
Dependency inversion principle
Cuando dise˜namos una API, usualmente lo hacemos pensando en lo
que la API necesita
Jos´e Luis Diaz 26 de junio de 2014 29 / 80
45. SOLID Dependency inversion principle
Dependency inversion principle
Cuando dise˜namos una API, usualmente lo hacemos pensando en lo
que la API necesita
Cuando en realidad deber´ıamos pensar lo que el cliente necesita
Jos´e Luis Diaz 26 de junio de 2014 29 / 80
46. SOLID Dependency inversion principle
Dependency inversion principle
Cuando dise˜namos una API, usualmente lo hacemos pensando en lo
que la API necesita
Cuando en realidad deber´ıamos pensar lo que el cliente necesita
Esto invierte la dependencia
Jos´e Luis Diaz 26 de junio de 2014 29 / 80
47. Testing
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 30 / 80
48. Testing Test First Development
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 31 / 80
49. Testing Test First Development
Tipos de Tests
Unit Test: Prueba clases y m´etodos, usualmente corren r´apido y
ayudan a aislar cuando un error ocurre
Jos´e Luis Diaz 26 de junio de 2014 32 / 80
50. Testing Test First Development
Tipos de Tests
Unit Test: Prueba clases y m´etodos, usualmente corren r´apido y
ayudan a aislar cuando un error ocurre
Integration Test: Prueba el comportamiento de componentes, y sus
dependencias.
Jos´e Luis Diaz 26 de junio de 2014 32 / 80
51. Testing Test First Development
Tipos de Tests
Unit Test: Prueba clases y m´etodos, usualmente corren r´apido y
ayudan a aislar cuando un error ocurre
Integration Test: Prueba el comportamiento de componentes, y sus
dependencias.
System Test: Prueba el sistema entero.
Jos´e Luis Diaz 26 de junio de 2014 32 / 80
52. Testing Test First Development
Que es TDD?
Test Driven Development no es una metodolog´ıa de test
Jos´e Luis Diaz 26 de junio de 2014 33 / 80
53. Testing Test First Development
Que es TDD?
Test Driven Development no es una metodolog´ıa de test
Test Driven Development es una metodolog´ıa de dise˜no
Jos´e Luis Diaz 26 de junio de 2014 33 / 80
54. Testing Test First Development
Que es TDD?
Test Driven Development no es una metodolog´ıa de test
Test Driven Development es una metodolog´ıa de dise˜no
No deja de lado el uso de QA, pero ayuda!
Jos´e Luis Diaz 26 de junio de 2014 33 / 80
55. Testing Test First Development
Test Driven es Test First
TDD significa diferentes cosas para diferentes personas.
Jos´e Luis Diaz 26 de junio de 2014 34 / 80
56. Testing Test First Development
Test Driven es Test First
TDD significa diferentes cosas para diferentes personas.
Para nosotros, significa primero Testear
Jos´e Luis Diaz 26 de junio de 2014 34 / 80
57. Testing Test First Development
¿Testear primero o al final?
Si escribimos los Tests al principio ganamos algo de valor en cada
paso.
Jos´e Luis Diaz 26 de junio de 2014 35 / 80
58. Testing Test First Development
¿Testear primero o al final?
Si escribimos los Tests al principio ganamos algo de valor en cada
paso.
Si escribimos los Tests al final, solo tenemos buenas noticias o malas
noticias.
Jos´e Luis Diaz 26 de junio de 2014 35 / 80
59. Testing Test First Development
¿Como puede ser m´as r´apido?
Cada clase que se utilice producci´on tiene una clase de Test
Jos´e Luis Diaz 26 de junio de 2014 36 / 80
60. Testing Test First Development
¿Como puede ser m´as r´apido?
Cada clase que se utilice producci´on tiene una clase de Test
Cada m´etodo que se utilice en producci´on tiene un m´etodo de Test
Jos´e Luis Diaz 26 de junio de 2014 36 / 80
61. Testing Test First Development
¿Como puede ser m´as r´apido?
Cada clase que se utilice producci´on tiene una clase de Test
Cada m´etodo que se utilice en producci´on tiene un m´etodo de Test
¿Como escribir m´as c´odigo puede ser m´as r´apido?
Jos´e Luis Diaz 26 de junio de 2014 36 / 80
62. Testing Test First Development
¿Que dejamos de hacer?
se vuelven una forma de requerimientos, dejamos de pasar tiempo
escribiendo documentos de requerimientos
Jos´e Luis Diaz 26 de junio de 2014 37 / 80
63. Testing Test First Development
¿Que dejamos de hacer?
se vuelven una forma de requerimientos, dejamos de pasar tiempo
escribiendo documentos de requerimientos
nos ayudan a encontrar bugs mas r´apido, pasamos menos tiempo en
el debugger
Jos´e Luis Diaz 26 de junio de 2014 37 / 80
64. Testing Test First Development
¿Que dejamos de hacer?
se vuelven una forma de requerimientos, dejamos de pasar tiempo
escribiendo documentos de requerimientos
nos ayudan a encontrar bugs mas r´apido, pasamos menos tiempo en
el debugger
nos ayudan a integrar c´odigo, pasamos menos tiempo integrando
c´odigo
Jos´e Luis Diaz 26 de junio de 2014 37 / 80
65. Testing Test First Development
¿Que dejamos de hacer?
se vuelven una forma de requerimientos, dejamos de pasar tiempo
escribiendo documentos de requerimientos
nos ayudan a encontrar bugs mas r´apido, pasamos menos tiempo en
el debugger
nos ayudan a integrar c´odigo, pasamos menos tiempo integrando
c´odigo
nos dan energ´ıa y confianza
Jos´e Luis Diaz 26 de junio de 2014 37 / 80
66. Testing Test First Development
Primero testear
Escribir test puede ser incomodo al principio
Jos´e Luis Diaz 26 de junio de 2014 38 / 80
67. Testing Test First Development
Primero testear
Escribir test puede ser incomodo al principio
Con la practica se vuelve mucho m´as f´acil
Jos´e Luis Diaz 26 de junio de 2014 38 / 80
68. Testing Test First Development
Primero testear
Escribir test puede ser incomodo al principio
Con la practica se vuelve mucho m´as f´acil
Nos ayuda a dise˜nar lo que queremos construir
Jos´e Luis Diaz 26 de junio de 2014 38 / 80
69. Testing Test First Development
Lento m´as que r´apido
Aprender algo nuevo siempre es dif´ıcil al principio
Jos´e Luis Diaz 26 de junio de 2014 39 / 80
70. Testing Test First Development
Lento m´as que r´apido
Aprender algo nuevo siempre es dif´ıcil al principio
Una vez que uno se vuelve bueno, se vuelve mucho mas r´apido
Jos´e Luis Diaz 26 de junio de 2014 39 / 80
71. Testing Test First Development
Lento m´as que r´apido
Aprender algo nuevo siempre es dif´ıcil al principio
Una vez que uno se vuelve bueno, se vuelve mucho mas r´apido
Equipos usando TDD reportan un incremento de un 20˜50 % de
velocidad y un 80 % de reducci´on de defectos el primer a˜no
Jos´e Luis Diaz 26 de junio de 2014 39 / 80
72. Testing Test First Development
Empujar el desarrollo con Test
Escribir Tests antes de escribir la implementaci´on
Jos´e Luis Diaz 26 de junio de 2014 40 / 80
73. Testing Test First Development
Empujar el desarrollo con Test
Escribir Tests antes de escribir la implementaci´on
Refactor, para mejorar la calidad
Jos´e Luis Diaz 26 de junio de 2014 40 / 80
74. Testing Test First Development
Empujar el desarrollo con Test
Escribir Tests antes de escribir la implementaci´on
Refactor, para mejorar la calidad
Mocks, stubs, y shunts
Jos´e Luis Diaz 26 de junio de 2014 40 / 80
75. Testing Test First Development
Empujar el desarrollo con Test
Escribir Tests antes de escribir la implementaci´on
Refactor, para mejorar la calidad
Mocks, stubs, y shunts
Inyecci´on de dependencias
Jos´e Luis Diaz 26 de junio de 2014 40 / 80
76. Testing Test First Development
Beneficios de TDD
Enfocarse en buenos principios de dise˜no
Jos´e Luis Diaz 26 de junio de 2014 41 / 80
77. Testing Test First Development
Beneficios de TDD
Enfocarse en buenos principios de dise˜no
Separaci´on de responsabilidades: hacerlo funcionar y asegurar calidad
Jos´e Luis Diaz 26 de junio de 2014 41 / 80
78. Testing Test First Development
Beneficios de TDD
Enfocarse en buenos principios de dise˜no
Separaci´on de responsabilidades: hacerlo funcionar y asegurar calidad
Desarmar tareas complejas en tareas m´as simples
Jos´e Luis Diaz 26 de junio de 2014 41 / 80
79. Testing Test First Development
Beneficios de TDD
Enfocarse en buenos principios de dise˜no
Separaci´on de responsabilidades: hacerlo funcionar y asegurar calidad
Desarmar tareas complejas en tareas m´as simples
Un conjunto completo de Tests de regresi´on
Jos´e Luis Diaz 26 de junio de 2014 41 / 80
80. Testing Test First Development
¿Por que funciona?
Nos mantiene enfocado en las tareas adecuadas en el momento
adecuado
Jos´e Luis Diaz 26 de junio de 2014 42 / 80
81. Testing Test First Development
¿Por que funciona?
Nos mantiene enfocado en las tareas adecuadas en el momento
adecuado
Separa las tareas en pedazos manejables
Jos´e Luis Diaz 26 de junio de 2014 42 / 80
82. Testing Test First Development
¿Por que funciona?
Nos mantiene enfocado en las tareas adecuadas en el momento
adecuado
Separa las tareas en pedazos manejables
Separa el desarrollo en la forma natural en la que pensamos
Jos´e Luis Diaz 26 de junio de 2014 42 / 80
83. Testing Test First Development
Herramientas para Test unitario
xUnit JUnit para java, NUnit para ˙Net
Jos´e Luis Diaz 26 de junio de 2014 43 / 80
84. Testing Test First Development
Herramientas para Test unitario
xUnit JUnit para java, NUnit para ˙Net
herramientas de cobertura de c´odigo
Jos´e Luis Diaz 26 de junio de 2014 43 / 80
85. Testing Test First Development
Herramientas para Test unitario
xUnit JUnit para java, NUnit para ˙Net
herramientas de cobertura de c´odigo
frameworks para Mocking
Jos´e Luis Diaz 26 de junio de 2014 43 / 80
86. Testing Test First Development
Los tres primeros pasos para testear
Escribir un Test que falle
Jos´e Luis Diaz 26 de junio de 2014 44 / 80
87. Testing Test First Development
Los tres primeros pasos para testear
Escribir un Test que falle
Hacerlo andar
Jos´e Luis Diaz 26 de junio de 2014 44 / 80
88. Testing Test First Development
Los tres primeros pasos para testear
Escribir un Test que falle
Hacerlo andar
Refactorizar por calidad
Jos´e Luis Diaz 26 de junio de 2014 44 / 80
89. Testing Test First Development
Rojo, Verde
Barra Roja: escribir un m´etodo que tenga una aserci´on en como se
deber´ıa llamar al m´etodo
Jos´e Luis Diaz 26 de junio de 2014 45 / 80
90. Testing Test First Development
Rojo, Verde
Barra Roja: escribir un m´etodo que tenga una aserci´on en como se
deber´ıa llamar al m´etodo
Barra Verde: Hacerlo andar!
Jos´e Luis Diaz 26 de junio de 2014 45 / 80
91. Testing Test First Development
Rojo, Verde
Barra Roja: escribir un m´etodo que tenga una aserci´on en como se
deber´ıa llamar al m´etodo
Barra Verde: Hacerlo andar!
Refactorizar: Limpiarlo y hacerlo sop´ortale
Jos´e Luis Diaz 26 de junio de 2014 45 / 80
92. Testing Test First Development
Rojo, Verde
Barra Roja: escribir un m´etodo que tenga una aserci´on en como se
deber´ıa llamar al m´etodo
Barra Verde: Hacerlo andar!
Refactorizar: Limpiarlo y hacerlo sop´ortale
Repetir
Jos´e Luis Diaz 26 de junio de 2014 45 / 80
93. Testing Test First Development
Escribir un Test que falle
TDD no es directamente obtener la barra verde, es convertir la barra
roja en barra verde
Jos´e Luis Diaz 26 de junio de 2014 46 / 80
94. Testing Test First Development
Escribir un Test que falle
TDD no es directamente obtener la barra verde, es convertir la barra
roja en barra verde
Siempre hay que empezar con un test que falle
Jos´e Luis Diaz 26 de junio de 2014 46 / 80
95. Testing Test First Development
Escribir un Test que falle
TDD no es directamente obtener la barra verde, es convertir la barra
roja en barra verde
Siempre hay que empezar con un test que falle
Si un test no falla estrepitosamente no es un test para nada
Jos´e Luis Diaz 26 de junio de 2014 46 / 80
96. Testing Test First Development
Escribir un Test que falle
TDD no es directamente obtener la barra verde, es convertir la barra
roja en barra verde
Siempre hay que empezar con un test que falle
Si un test no falla estrepitosamente no es un test para nada
La verificaci´on de un test podr´ıa ser ver que un test fallo antes de
funcionar
Jos´e Luis Diaz 26 de junio de 2014 46 / 80
97. Testing Test First Development
Celebrar la barra Roja
Los Tests que son mas valiosos son los que fallan.
Jos´e Luis Diaz 26 de junio de 2014 47 / 80
98. Testing Test First Development
Celebrar la barra Roja
Los Tests que son mas valiosos son los que fallan.
Tenemos que hacer un mont´on para obtener la barra roja
Jos´e Luis Diaz 26 de junio de 2014 47 / 80
99. Testing Test First Development
Celebrar la barra Roja
Los Tests que son mas valiosos son los que fallan.
Tenemos que hacer un mont´on para obtener la barra roja
Tenemos que pensar que hace el m´etodo que queremos testear
Jos´e Luis Diaz 26 de junio de 2014 47 / 80
100. Testing Test First Development
Celebrar la barra Roja
Los Tests que son mas valiosos son los que fallan.
Tenemos que hacer un mont´on para obtener la barra roja
Tenemos que pensar que hace el m´etodo que queremos testear
Definir como lo vamos a llamar
Jos´e Luis Diaz 26 de junio de 2014 47 / 80
101. Testing Test First Development
Celebrar la barra Roja
Los Tests que son mas valiosos son los que fallan.
Tenemos que hacer un mont´on para obtener la barra roja
Tenemos que pensar que hace el m´etodo que queremos testear
Definir como lo vamos a llamar
Definir que va a devolver
Jos´e Luis Diaz 26 de junio de 2014 47 / 80
102. Testing Test First Development
Obteniendo la barra verde
Obtener la barra roja esta bien, quedarse ah´ı no
Jos´e Luis Diaz 26 de junio de 2014 48 / 80
103. Testing Test First Development
Obteniendo la barra verde
Obtener la barra roja esta bien, quedarse ah´ı no
Obtener la barra verde puede ser f´acil, quedarse ah´ı no
Jos´e Luis Diaz 26 de junio de 2014 48 / 80
104. Testing Test First Development
Obteniendo la barra verde
Obtener la barra roja esta bien, quedarse ah´ı no
Obtener la barra verde puede ser f´acil, quedarse ah´ı no
Pasos separados:
Jos´e Luis Diaz 26 de junio de 2014 48 / 80
105. Testing Test First Development
Obteniendo la barra verde
Obtener la barra roja esta bien, quedarse ah´ı no
Obtener la barra verde puede ser f´acil, quedarse ah´ı no
Pasos separados:
Hacerlo andar
Jos´e Luis Diaz 26 de junio de 2014 48 / 80
106. Testing Test First Development
Obteniendo la barra verde
Obtener la barra roja esta bien, quedarse ah´ı no
Obtener la barra verde puede ser f´acil, quedarse ah´ı no
Pasos separados:
Hacerlo andar
Hacerlo mantenible
Jos´e Luis Diaz 26 de junio de 2014 48 / 80
107. Testing Test First Development
Refactorizar el C´odigo
Limpiar la l´ogica, hacerla f´acil de leer
Jos´e Luis Diaz 26 de junio de 2014 49 / 80
108. Testing Test First Development
Refactorizar el C´odigo
Limpiar la l´ogica, hacerla f´acil de leer
Renombrar m´etodos, hacer que reflejen lo que hacen
Jos´e Luis Diaz 26 de junio de 2014 49 / 80
109. Testing Test First Development
Refactorizar el C´odigo
Limpiar la l´ogica, hacerla f´acil de leer
Renombrar m´etodos, hacer que reflejen lo que hacen
Eliminar redundancia, encapsular variaci´on
Jos´e Luis Diaz 26 de junio de 2014 49 / 80
110. Testing Test First Development
Refactorizar los Tests
Cuando uno est´a intentando entender que tiene que hacer,
probablemente escriba muchos tests
Jos´e Luis Diaz 26 de junio de 2014 50 / 80
111. Testing Test First Development
Refactorizar los Tests
Cuando uno est´a intentando entender que tiene que hacer,
probablemente escriba muchos tests
Este tipo de triangulaci´on puede ser ´util
Jos´e Luis Diaz 26 de junio de 2014 50 / 80
112. Testing Test First Development
Refactorizar los Tests
Cuando uno est´a intentando entender que tiene que hacer,
probablemente escriba muchos tests
Este tipo de triangulaci´on puede ser ´util
Los Tests extras, borrarlos!
Jos´e Luis Diaz 26 de junio de 2014 50 / 80
113. Testing Test First Development
Un ejemplo
Supongamos que quiero escribir una clase “adder”
Jos´e Luis Diaz 26 de junio de 2014 51 / 80
114. Testing Test First Development
Un ejemplo
Supongamos que quiero escribir una clase “adder”
Empezar´ıa escribiendo un test que falla
Jos´e Luis Diaz 26 de junio de 2014 51 / 80
115. Testing Test First Development
Un ejemplo
Supongamos que quiero escribir una clase “adder”
Empezar´ıa escribiendo un test que falla
1 Adder adder = new Adder();
2 assertEquals(2, adder.add(1,1));
Jos´e Luis Diaz 26 de junio de 2014 51 / 80
116. Testing Test First Development
Un ejemplo
Supongamos que quiero escribir una clase “adder”
Empezar´ıa escribiendo un test que falla
1 Adder adder = new Adder();
2 assertEquals(2, adder.add(1,1));
Y el c´odigo m´as simple para que compile
Jos´e Luis Diaz 26 de junio de 2014 51 / 80
117. Testing Test First Development
Un ejemplo
Supongamos que quiero escribir una clase “adder”
Empezar´ıa escribiendo un test que falla
1 Adder adder = new Adder();
2 assertEquals(2, adder.add(1,1));
Y el c´odigo m´as simple para que compile
1 public class Adder {
2 public int add(int p1, int p2) {
3 return 0;
4 }
5 }
Jos´e Luis Diaz 26 de junio de 2014 51 / 80
118. Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 52 / 80
119. Testing Test First Development
Una buena idea
Cual es la forma m´as r´apida de ir hacia la barra verde?
Jos´e Luis Diaz 26 de junio de 2014 53 / 80
120. Testing Test First Development
Una buena idea
Cual es la forma m´as r´apida de ir hacia la barra verde?
1 public class Adder {
2 public int add(int p1, int p2) {
3 return 2;
4 }
5 }
Jos´e Luis Diaz 26 de junio de 2014 53 / 80
121. Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 54 / 80
122. Testing Test First Development
Intentemos otro m´as
1 assertEquals(4, adder.add(1,1));
Jos´e Luis Diaz 26 de junio de 2014 55 / 80
123. Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 56 / 80
124. Testing Test First Development
Opciones
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
125. Testing Test First Development
Opciones
Podemos agregar l´ogica condicional
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
126. Testing Test First Development
Opciones
Podemos agregar l´ogica condicional
1 public class Adder {
2 public int add(int p1, int p2) {
3 if (p1 == 1 && p2 == 1) return 2;
4 if (p1 == 2 && p2 == 2) return 4;
5 return 0
6 }
7 }
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
127. Testing Test First Development
Opciones
Podemos agregar l´ogica condicional
1 public class Adder {
2 public int add(int p1, int p2) {
3 if (p1 == 1 && p2 == 1) return 2;
4 if (p1 == 2 && p2 == 2) return 4;
5 return 0
6 }
7 }
o simplemente
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
128. Testing Test First Development
Opciones
Podemos agregar l´ogica condicional
1 public class Adder {
2 public int add(int p1, int p2) {
3 if (p1 == 1 && p2 == 1) return 2;
4 if (p1 == 2 && p2 == 2) return 4;
5 return 0
6 }
7 }
o simplemente
1 public class Adder {
2 public int add(int p1, int p2) {
3 return p1+p2
4 }
5 }
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
129. Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 58 / 80
130. Testing Test First Development
Caracter´ısticas de un buen test
Corren R´apido, deben tener un setup y un teardown cortos. Los test
deben correr aislados y no deber´ıa importar el orden en que corran.
Jos´e Luis Diaz 26 de junio de 2014 59 / 80
131. Testing Test First Development
Caracter´ısticas de un buen test
Corren R´apido, deben tener un setup y un teardown cortos. Los test
deben correr aislados y no deber´ıa importar el orden en que corran.
Bien nombrados, si una abstracci´on no tiene un nombre adecuado
probablemente est´e mal
Jos´e Luis Diaz 26 de junio de 2014 59 / 80
132. Testing Test First Development
Caracter´ısticas de un buen test
Corren R´apido, deben tener un setup y un teardown cortos. Los test
deben correr aislados y no deber´ıa importar el orden en que corran.
Bien nombrados, si una abstracci´on no tiene un nombre adecuado
probablemente est´e mal
Usar datos que representan como el sistema realmente va a ser
utilizado
Jos´e Luis Diaz 26 de junio de 2014 59 / 80
133. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
134. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
135. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
No hay que asumir que los test corren en ning´un orden
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
136. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
No hay que asumir que los test corren en ning´un orden
Arrancar con el caso mas simple
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
137. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
No hay que asumir que los test corren en ning´un orden
Arrancar con el caso mas simple
Asegurarse que el Test mantiene valida una intenci´on
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
138. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
No hay que asumir que los test corren en ning´un orden
Arrancar con el caso mas simple
Asegurarse que el Test mantiene valida una intenci´on
Mantener los Tests repetibles
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
139. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
No hay que asumir que los test corren en ning´un orden
Arrancar con el caso mas simple
Asegurarse que el Test mantiene valida una intenci´on
Mantener los Tests repetibles
No harcodear locaciones
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
140. Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Hacer que los Tests corran r´apido testeando solo lo que se necesita
testear
No hay que asumir que los test corren en ning´un orden
Arrancar con el caso mas simple
Asegurarse que el Test mantiene valida una intenci´on
Mantener los Tests repetibles
No harcodear locaciones
Hacer los mensajes de error informativos
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
141. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
142. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
M´etodos static, o private
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
143. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
M´etodos static, o private
M´etodos que no son determiniticos
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
144. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
M´etodos static, o private
M´etodos que no son determiniticos
M´etodos que no son cohesivos
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
145. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
M´etodos static, o private
M´etodos que no son determiniticos
M´etodos que no son cohesivos
Jerarqu´ıa de clases profundas
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
146. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
M´etodos static, o private
M´etodos que no son determiniticos
M´etodos que no son cohesivos
Jerarqu´ıa de clases profundas
Cuando se construyen objetos en los constructores
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
147. Testing Test First Development
Que es dif´ıcil testear
M´etodos que retornan void
M´etodos static, o private
M´etodos que no son determiniticos
M´etodos que no son cohesivos
Jerarqu´ıa de clases profundas
Cuando se construyen objetos en los constructores
Estado global
Jos´e Luis Diaz 26 de junio de 2014 61 / 80
148. Testing Test First Development
Preguntas para hacerse
Cuanto difiere TDD de lo que yo originalmente pensaba
Jos´e Luis Diaz 26 de junio de 2014 62 / 80
149. Testing Test First Development
Preguntas para hacerse
Cuanto difiere TDD de lo que yo originalmente pensaba
Que beneficio puedo obtener de TDD
Jos´e Luis Diaz 26 de junio de 2014 62 / 80
150. Testing Test First Development
Preguntas para hacerse
Cuanto difiere TDD de lo que yo originalmente pensaba
Que beneficio puedo obtener de TDD
Como decidir cual es el numero correcto de Unit Test por clase
Jos´e Luis Diaz 26 de junio de 2014 62 / 80
151. Testing T´ecnicas de testing
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 63 / 80
152. Testing T´ecnicas de testing
Fases de un test
Setup
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
153. Testing T´ecnicas de testing
Fases de un test
Setup
Ejercitarlo
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
154. Testing T´ecnicas de testing
Fases de un test
Setup
Ejercitarlo
Verificarlo
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
155. Testing T´ecnicas de testing
Fases de un test
Setup
Ejercitarlo
Verificarlo
Teardown
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
156. Testing T´ecnicas de testing
Dos tipos de test
Jos´e Luis Diaz 26 de junio de 2014 65 / 80
157. Testing T´ecnicas de testing
Dos tipos de test
Boundary tests: definir condiciones de frontera
Jos´e Luis Diaz 26 de junio de 2014 65 / 80
158. Testing T´ecnicas de testing
Dos tipos de test
Boundary tests: definir condiciones de frontera
Workflow tests: testear una secuencia de eventos
Jos´e Luis Diaz 26 de junio de 2014 65 / 80
159. Testing T´ecnicas de testing
Boundary tests
Jos´e Luis Diaz 26 de junio de 2014 66 / 80
160. Testing T´ecnicas de testing
Boundary tests
Los tests de fronteras est´an expresado por aserciones
Jos´e Luis Diaz 26 de junio de 2014 66 / 80
161. Testing T´ecnicas de testing
Boundary tests
Los tests de fronteras est´an expresado por aserciones
Usan alg´un framework de unit testing
Jos´e Luis Diaz 26 de junio de 2014 66 / 80
162. Testing T´ecnicas de testing
Boundary tests
Los tests de fronteras est´an expresado por aserciones
Usan alg´un framework de unit testing
Se aseguran que se retornen valores correctos para determinados
parametros
Jos´e Luis Diaz 26 de junio de 2014 66 / 80
163. Testing T´ecnicas de testing
Workflow Testing
Jos´e Luis Diaz 26 de junio de 2014 67 / 80
164. Testing T´ecnicas de testing
Workflow Testing
Los test de secuencia usan objetos de tipo Mock para inspeccionar y
verificar las llamadas hechas en una secuencia especifica
Jos´e Luis Diaz 26 de junio de 2014 67 / 80
165. Testing T´ecnicas de testing
Workflow Testing
Los test de secuencia usan objetos de tipo Mock para inspeccionar y
verificar las llamadas hechas en una secuencia especifica
Usan un framework de mocking
Jos´e Luis Diaz 26 de junio de 2014 67 / 80
166. Testing T´ecnicas de testing
Workflow Testing
Los test de secuencia usan objetos de tipo Mock para inspeccionar y
verificar las llamadas hechas en una secuencia especifica
Usan un framework de mocking
Aseguran que el flujo funciona correctamente
Jos´e Luis Diaz 26 de junio de 2014 67 / 80
167. Testing T´ecnicas de testing
Manejando las dependencias
Jos´e Luis Diaz 26 de junio de 2014 68 / 80
168. Testing T´ecnicas de testing
Manejando las dependencias
No todo lo que testeamos est´a bajo nuestro control
Jos´e Luis Diaz 26 de junio de 2014 68 / 80
169. Testing T´ecnicas de testing
Manejando las dependencias
No todo lo que testeamos est´a bajo nuestro control
Necesitamos poder manejar esas dependencias
Jos´e Luis Diaz 26 de junio de 2014 68 / 80
170. Testing T´ecnicas de testing
Manejando las dependencias
No todo lo que testeamos est´a bajo nuestro control
Necesitamos poder manejar esas dependencias
Como hacemos para testear un webservice?
Jos´e Luis Diaz 26 de junio de 2014 68 / 80
171. Testing T´ecnicas de testing
Mocks hechos a mano
Usualmente es una subclase de la clase que estamos mock-eando o
implementa la misma interface
Jos´e Luis Diaz 26 de junio de 2014 69 / 80
172. Testing T´ecnicas de testing
Mocks hechos a mano
Usualmente es una subclase de la clase que estamos mock-eando o
implementa la misma interface
Contienen m´etodos para agregar y remover estado
Jos´e Luis Diaz 26 de junio de 2014 69 / 80
173. Testing T´ecnicas de testing
Mocks hechos a mano
Usualmente es una subclase de la clase que estamos mock-eando o
implementa la misma interface
Contienen m´etodos para agregar y remover estado
Escritos a mano; no hay necesidad de ning´un framework
Jos´e Luis Diaz 26 de junio de 2014 69 / 80
174. Testing T´ecnicas de testing
Mocks estaticos
Derivado de una clase, una interfase o un objeto
Jos´e Luis Diaz 26 de junio de 2014 70 / 80
175. Testing T´ecnicas de testing
Mocks estaticos
Derivado de una clase, una interfase o un objeto
Usualmente es generador por una herramienta de mocking
Jos´e Luis Diaz 26 de junio de 2014 70 / 80
176. Testing T´ecnicas de testing
Mocks estaticos
Derivado de una clase, una interfase o un objeto
Usualmente es generador por una herramienta de mocking
Es inspeccionable o se puede grabar
Jos´e Luis Diaz 26 de junio de 2014 70 / 80
177. Testing T´ecnicas de testing
Mocks inspeccionables
Estos mocks pueden estar condicionados diciendo que deben esperar
Una vez que el mock esta creado, el c´odigo puede ser testeado
Despu´es se verifica que las llamadas hayan sido correctas
Jos´e Luis Diaz 26 de junio de 2014 71 / 80
178. Testing Dependencias
Agenda
1 Principios de dise˜no
Ocultaci´on de la informaci´on
Hacia los objetos
2 SOLID
Single responsibility principle
Open-closed principle
Liskov substitution principle
Interface segregation principle
Dependency inversion principle
3 Testing
Test First Development
T´ecnicas de testing
Dependencias
Jos´e Luis Diaz 26 de junio de 2014 72 / 80
179. Testing Dependencias
En vez de hacer esto
1 public class MyClass {
2 public MyClass() throws IOException {
3 this.thread = new Thread();
4 this.fileWriter = new FileWriter(new File(‘‘myfile.txt’’));
5 }
6 }
Jos´e Luis Diaz 26 de junio de 2014 73 / 80
180. Testing Dependencias
Hacer esto
Delegar la creaci´on a una Factory
1 public class MyClassFactory {
2 public MyClass getWithDependencies() {
3 Thread thread = new Thread();
4 FileWriter fileWriter = new FileWriter(new File(‘‘myfile.txt’’
5 return new MyClass(thread, fileWriter)
6 }
7 }
8
9 public class MyClass {
0 public MyClass(Thread thread, FileWriter fileWriter) throws IOEx
1 this.thread = thread;
2 this.fileWriter = fileWriter;
3 }
4 }
Jos´e Luis Diaz 26 de junio de 2014 74 / 80
181. Testing Dependencias
Inyecci´on de dependencias
En esta t´ecnica pasamos la dependencia en el constructor
Esto nos habilita a pasar tipos cuando lo creamos conveniente
Jos´e Luis Diaz 26 de junio de 2014 75 / 80
182. Testing Dependencias
Otro ejemplo
1 public class Motorboat {
2 private Motor myMotor;
3
4 public Motorboat() {
5 myMotor = new V6_Cat_motor(); // oculta
6 }
7
8 }
Jos´e Luis Diaz 26 de junio de 2014 76 / 80
183. Testing Dependencias
Una opci´on
1
2 public Motorboat(Motor aMotor) {
3 myMotor = motor;
4 }
5
6 public Motorboat() {
7 myMotor = new V6_Cat_motor();
8 }
Jos´e Luis Diaz 26 de junio de 2014 77 / 80
184. Testing Dependencias
Otra opci´on
1 public Motorboat() {
2 myMotor = makeMotor();
3 }
4
5 protected static Motor makeMotor() {
6 return new V6_Cat_motor()
7 }
Jos´e Luis Diaz 26 de junio de 2014 78 / 80
185. Testing Dependencias
y una innerclass
1 public class MotorBoardTest {
2 private Motorboat testMotorboat;
3 static private Motor mockMotor = new MockMotor();
4
5 @Before
6 public void startupTest() {
7 testMotorboat = new TesteableMotorboat();
8 }
9
0 private class TesteableMotorboat extends Motorboat {
1 protected static Motor makeMotor() {
2 return mockMotor;
3 }
4 }
5 }
Jos´e Luis Diaz 26 de junio de 2014 79 / 80