SlideShare a Scribd company logo
1 of 186
Download to read offline
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
SOLID Single responsibility principle
¿Por qu´e es importante este principio?
Jos´e Luis Diaz 26 de junio de 2014 11 / 80
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
SOLID Interface segregation principle
TimerClient
Door TimedDoor
Jos´e Luis Diaz 26 de junio de 2014 24 / 80
SOLID Interface segregation principle
Door
TimedDoor DoorTimerAdapter
TimerClient
Jos´e Luis Diaz 26 de junio de 2014 25 / 80
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Testing Test First Development
Primero testear
Escribir test puede ser incomodo al principio
Jos´e Luis Diaz 26 de junio de 2014 38 / 80
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Testing Test First Development
Un ejemplo
Supongamos que quiero escribir una clase “adder”
Jos´e Luis Diaz 26 de junio de 2014 51 / 80
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
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
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
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
Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 52 / 80
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
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
Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 54 / 80
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
Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 56 / 80
Testing Test First Development
Opciones
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
Testing Test First Development
Opciones
Podemos agregar l´ogica condicional
Jos´e Luis Diaz 26 de junio de 2014 57 / 80
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
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
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
Testing Test First Development
Jos´e Luis Diaz 26 de junio de 2014 58 / 80
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
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
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
Testing Test First Development
Algunos TIPS
Hacer que el Test primero falle
Jos´e Luis Diaz 26 de junio de 2014 60 / 80
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Testing T´ecnicas de testing
Fases de un test
Setup
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
Testing T´ecnicas de testing
Fases de un test
Setup
Ejercitarlo
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
Testing T´ecnicas de testing
Fases de un test
Setup
Ejercitarlo
Verificarlo
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
Testing T´ecnicas de testing
Fases de un test
Setup
Ejercitarlo
Verificarlo
Teardown
Jos´e Luis Diaz 26 de junio de 2014 64 / 80
Testing T´ecnicas de testing
Dos tipos de test
Jos´e Luis Diaz 26 de junio de 2014 65 / 80
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
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
Testing T´ecnicas de testing
Boundary tests
Jos´e Luis Diaz 26 de junio de 2014 66 / 80
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
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
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
Testing T´ecnicas de testing
Workflow Testing
Jos´e Luis Diaz 26 de junio de 2014 67 / 80
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
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
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
Testing T´ecnicas de testing
Manejando las dependencias
Jos´e Luis Diaz 26 de junio de 2014 68 / 80
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Testing Dependencias
Gracias!
Jos´e Luis Diaz 26 de junio de 2014 80 / 80

More Related Content

Similar to Técnicas de programación

Metodología de desarrollo de software
Metodología de desarrollo de software Metodología de desarrollo de software
Metodología de desarrollo de software alexandermedranorodr
 
Clean code 10-11
Clean code 10-11Clean code 10-11
Clean code 10-11540deg
 
Programación del curso inf212 - POO
Programación del curso inf212 - POOProgramación del curso inf212 - POO
Programación del curso inf212 - POODiego Santimateo
 
Guia de ejercicios_java_resueltos
Guia de ejercicios_java_resueltosGuia de ejercicios_java_resueltos
Guia de ejercicios_java_resueltosDamian Morocho
 
Leccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesLeccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesdelosgonzalez2
 
Principios SOLID de Diseño Orientado a Objetos
Principios SOLID de Diseño Orientado a ObjetosPrincipios SOLID de Diseño Orientado a Objetos
Principios SOLID de Diseño Orientado a ObjetosJose E. Rodriguez Huerta
 
Leccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesLeccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesFiorelamendez
 
Leccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesLeccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesFiorelamendez
 
Taller Evento TestingUY 2018 - Probando la experiencia de usuario
Taller Evento TestingUY 2018 - Probando la experiencia de usuarioTaller Evento TestingUY 2018 - Probando la experiencia de usuario
Taller Evento TestingUY 2018 - Probando la experiencia de usuarioTestingUy
 
Taller en TestingUy 2018: Probando la experiencia de usuario
Taller en TestingUy 2018: Probando la experiencia de usuarioTaller en TestingUy 2018: Probando la experiencia de usuario
Taller en TestingUy 2018: Probando la experiencia de usuarioClaudia Badell
 
PROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdf
PROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdfPROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdf
PROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdfMaria Garcia
 
Introducción a las aplicaciones de OpenShift
Introducción a las aplicaciones de OpenShiftIntroducción a las aplicaciones de OpenShift
Introducción a las aplicaciones de OpenShiftAndy Juan Sarango Veliz
 
Ambientes Personales de Aprendizaje
Ambientes Personales de AprendizajeAmbientes Personales de Aprendizaje
Ambientes Personales de AprendizajeDiego Leal
 
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...Chistian Hernandez
 
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...Tania Tellez
 
Presentacion informatica ii-2014
Presentacion informatica ii-2014Presentacion informatica ii-2014
Presentacion informatica ii-2014mongeloco
 

Similar to Técnicas de programación (20)

Metodología de desarrollo de software
Metodología de desarrollo de software Metodología de desarrollo de software
Metodología de desarrollo de software
 
SOLID - ¿Cómo lo aplico a mi código?
SOLID - ¿Cómo lo aplico a mi código?SOLID - ¿Cómo lo aplico a mi código?
SOLID - ¿Cómo lo aplico a mi código?
 
Clean code 10-11
Clean code 10-11Clean code 10-11
Clean code 10-11
 
Programación del curso inf212 - POO
Programación del curso inf212 - POOProgramación del curso inf212 - POO
Programación del curso inf212 - POO
 
Guia de ejercicios_java_resueltos
Guia de ejercicios_java_resueltosGuia de ejercicios_java_resueltos
Guia de ejercicios_java_resueltos
 
Leccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesLeccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidades
 
Compendio u1
Compendio u1Compendio u1
Compendio u1
 
Principios SOLID de Diseño Orientado a Objetos
Principios SOLID de Diseño Orientado a ObjetosPrincipios SOLID de Diseño Orientado a Objetos
Principios SOLID de Diseño Orientado a Objetos
 
Leccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesLeccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidades
 
Leccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidadesLeccion 1. desarrollo de habilidades
Leccion 1. desarrollo de habilidades
 
Taller Evento TestingUY 2018 - Probando la experiencia de usuario
Taller Evento TestingUY 2018 - Probando la experiencia de usuarioTaller Evento TestingUY 2018 - Probando la experiencia de usuario
Taller Evento TestingUY 2018 - Probando la experiencia de usuario
 
Taller en TestingUy 2018: Probando la experiencia de usuario
Taller en TestingUy 2018: Probando la experiencia de usuarioTaller en TestingUy 2018: Probando la experiencia de usuario
Taller en TestingUy 2018: Probando la experiencia de usuario
 
PROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdf
PROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdfPROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdf
PROYECTO FINAL_TENDENCIAS TECNOLOGIAS DE INGENIERIA.pdf
 
Introducción a las aplicaciones de OpenShift
Introducción a las aplicaciones de OpenShiftIntroducción a las aplicaciones de OpenShift
Introducción a las aplicaciones de OpenShift
 
Visor de imágenes para una aplicación android
Visor de imágenes para una aplicación androidVisor de imágenes para una aplicación android
Visor de imágenes para una aplicación android
 
Ambientes Personales de Aprendizaje
Ambientes Personales de AprendizajeAmbientes Personales de Aprendizaje
Ambientes Personales de Aprendizaje
 
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
 
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
Prueba Corta: Video -Vida Real-Definicion de objetos, estado, comportamiento ...
 
Libertades de software
Libertades  de softwareLibertades  de software
Libertades de software
 
Presentacion informatica ii-2014
Presentacion informatica ii-2014Presentacion informatica ii-2014
Presentacion informatica ii-2014
 

Técnicas de programación

  • 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
  • 186. Testing Dependencias Gracias! Jos´e Luis Diaz 26 de junio de 2014 80 / 80