Técnicas de programación

186
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

description

Diseño de software orientado a objetos. Principios de diseño. Single responsibility principle. Open/closed principle. Liskov substitution principle. Interface segregation principle. Dependency inversion principle. TDD

Transcript of Técnicas de programación

Page 1: Técnicas de programación

Tecnicas avanzadas de programacion. . . o como hacer software sin morir en el intento

Jose Luis Diaz

26 de junio de 2014

Jose Luis Diaz 26 de junio de 2014 1 / 80

Page 2: Técnicas de programación

Principios de diseno

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 2 / 80

Page 3: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 3 / 80

Page 4: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Diseno

¿Por que disenar?

Incorporar nuevos requerimientos evitando que el diseno se degrade.

Los cambios puedan incorporarse con el menor costo posible.

Hacer el caso comun facil, el caso complejo posible (Joshua Bloshsobre los lenguajes)

Jose Luis Diaz 26 de junio de 2014 4 / 80

Page 5: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Diseno

¿Por que disenar?

Incorporar nuevos requerimientos evitando que el diseno se degrade.

Los cambios puedan incorporarse con el menor costo posible.

Hacer el caso comun facil, el caso complejo posible (Joshua Bloshsobre los lenguajes)

Jose Luis Diaz 26 de junio de 2014 4 / 80

Page 6: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Diseno

¿Por que disenar?

Incorporar nuevos requerimientos evitando que el diseno se degrade.

Los cambios puedan incorporarse con el menor costo posible.

Hacer el caso comun facil, el caso complejo posible (Joshua Bloshsobre los lenguajes)

Jose Luis Diaz 26 de junio de 2014 4 / 80

Page 7: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Diseno

¿Por que disenar?

Incorporar nuevos requerimientos evitando que el diseno se degrade.

Los cambios puedan incorporarse con el menor costo posible.

Hacer el caso comun facil, el caso complejo posible (Joshua Bloshsobre los lenguajes)

Jose Luis Diaz 26 de junio de 2014 4 / 80

Page 8: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Parnas

Una metodologıa para componentizar (Parnas, David a principio de los ’70)

Identificar potenciales componentes. Detectar desde losrequerimientos los que mas vayan a cambiar.

Se contraen y expanden los requerimientos de estos componentes.

Aislar estos componentes y generar interfaces que toleren estoscambios anticipados.

Jose Luis Diaz 26 de junio de 2014 5 / 80

Page 9: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Parnas

Una metodologıa para componentizar (Parnas, David a principio de los ’70)

Identificar potenciales componentes. Detectar desde losrequerimientos los que mas vayan a cambiar.

Se contraen y expanden los requerimientos de estos componentes.

Aislar estos componentes y generar interfaces que toleren estoscambios anticipados.

Jose Luis Diaz 26 de junio de 2014 5 / 80

Page 10: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Parnas

Una metodologıa para componentizar (Parnas, David a principio de los ’70)

Identificar potenciales componentes. Detectar desde losrequerimientos los que mas vayan a cambiar.

Se contraen y expanden los requerimientos de estos componentes.

Aislar estos componentes y generar interfaces que toleren estoscambios anticipados.

Jose Luis Diaz 26 de junio de 2014 5 / 80

Page 11: Técnicas de programación

Principios de diseno Ocultacion de la informacion

Parnas

Una metodologıa para componentizar (Parnas, David a principio de los ’70)

Identificar potenciales componentes. Detectar desde losrequerimientos los que mas vayan a cambiar.

Se contraen y expanden los requerimientos de estos componentes.

Aislar estos componentes y generar interfaces que toleren estoscambios anticipados.

Jose Luis Diaz 26 de junio de 2014 5 / 80

Page 12: Técnicas de programación

Principios de diseno Hacia los objetos

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 6 / 80

Page 13: Técnicas de programación

Principios de diseno Hacia los objetos

Limitaciones

Limitaciones del diseno basado en ocultacion de informacion.

Incluir todos los metodos de la interfaz de un modulo correspondientecomo un parametro.

Generar varios modulos iguales.

Poder tener varias implementaciones diferentes de un mismo moduloy poder intercambiarlos.

Jose Luis Diaz 26 de junio de 2014 7 / 80

Page 14: Técnicas de programación

Principios de diseno Hacia los objetos

Limitaciones

Limitaciones del diseno basado en ocultacion de informacion.

Incluir todos los metodos de la interfaz de un modulo correspondientecomo un parametro.

Generar varios modulos iguales.

Poder tener varias implementaciones diferentes de un mismo moduloy poder intercambiarlos.

Jose Luis Diaz 26 de junio de 2014 7 / 80

Page 15: Técnicas de programación

Principios de diseno Hacia los objetos

Limitaciones

Limitaciones del diseno basado en ocultacion de informacion.

Incluir todos los metodos de la interfaz de un modulo correspondientecomo un parametro.

Generar varios modulos iguales.

Poder tener varias implementaciones diferentes de un mismo moduloy poder intercambiarlos.

Jose Luis Diaz 26 de junio de 2014 7 / 80

Page 16: Técnicas de programación

Principios de diseno Hacia los objetos

Limitaciones

Limitaciones del diseno basado en ocultacion de informacion.

Incluir todos los metodos de la interfaz de un modulo correspondientecomo un parametro.

Generar varios modulos iguales.

Poder tener varias implementaciones diferentes de un mismo moduloy poder intercambiarlos.

Jose Luis Diaz 26 de junio de 2014 7 / 80

Page 17: Técnicas de programación

SOLID

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 8 / 80

Page 18: Técnicas de programación

SOLID Single responsibility principle

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 9 / 80

Page 19: Técnicas de programación

SOLID Single responsibility principle

Cada clase debe tener una unica responsabilidad, y que esta debe sercompletamente ocultada por la clase (o modulo).

Este principio fue originalmente descripto como “cohesion”, larelacion funcional de los elementos de una clase.

Jose Luis Diaz 26 de junio de 2014 10 / 80

Page 20: Técnicas de programación

SOLID Single responsibility principle

Cada clase debe tener una unica responsabilidad, y que esta debe sercompletamente ocultada por la clase (o modulo).

Este principio fue originalmente descripto como “cohesion”, larelacion funcional de los elementos de una clase.

Jose Luis Diaz 26 de junio de 2014 10 / 80

Page 21: Técnicas de programación

SOLID Single responsibility principle

¿Por que es importante este principio?

Si una clase tiene mas de una responsabilidad, entonces lasresponsabilidades estan acopladas.

Los cambios en una de las responsabilidades pueden alterar o inhibirla capacidad de la clase para cumplir con las otras.

Este tipo de acoplamiento conduce a disenos fragiles que se rompende manera inesperada cuando las clases cambian.

Jose Luis Diaz 26 de junio de 2014 11 / 80

Page 22: Técnicas de programación

SOLID Single responsibility principle

¿Por que es importante este principio?

Si una clase tiene mas de una responsabilidad, entonces lasresponsabilidades estan acopladas.

Los cambios en una de las responsabilidades pueden alterar o inhibirla capacidad de la clase para cumplir con las otras.

Este tipo de acoplamiento conduce a disenos fragiles que se rompende manera inesperada cuando las clases cambian.

Jose Luis Diaz 26 de junio de 2014 11 / 80

Page 23: Técnicas de programación

SOLID Single responsibility principle

¿Por que es importante este principio?

Si una clase tiene mas de una responsabilidad, entonces lasresponsabilidades estan acopladas.

Los cambios en una de las responsabilidades pueden alterar o inhibirla capacidad de la clase para cumplir con las otras.

Este tipo de acoplamiento conduce a disenos fragiles que se rompende manera inesperada cuando las clases cambian.

Jose Luis Diaz 26 de junio de 2014 11 / 80

Page 24: Técnicas de programación

SOLID Single responsibility principle

¿Por que es importante este principio?

Si una clase tiene mas de una responsabilidad, entonces lasresponsabilidades estan acopladas.

Los cambios en una de las responsabilidades pueden alterar o inhibirla capacidad de la clase para cumplir con las otras.

Este tipo de acoplamiento conduce a disenos fragiles que se rompende manera inesperada cuando las clases cambian.

Jose Luis Diaz 26 de junio de 2014 11 / 80

Page 25: Técnicas de programación

SOLID Single responsibility principle

Aplicación de geometría

computacionalAplicación gráfica

GUI

Rectángulo

+ dibujar()+ area(): double

Jose Luis Diaz 26 de junio de 2014 12 / 80

Page 26: Técnicas de programación

SOLID Single responsibility principle

Aplicación de geometría

computacionalAplicación gráficaGUI

Rectángulo

+ dibujar()

RectánguloGeométrico

+ area(): double

Jose Luis Diaz 26 de junio de 2014 13 / 80

Page 27: Técnicas de programación

SOLID Open-closed principle

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 14 / 80

Page 28: Técnicas de programación

SOLID Open-closed principle

Open-closed principle

Primera ves enunciada por Ivar Jacobson y luego reexpresada porBertran Meyer en “Object Oriented Software Construction”:

“Las entidades de software (clases, modulos, funciones, etc). Debenestar abiertas para extension, pero cerradas para modificacion”

Esforzarse para hacer que cuando el codigo cambie, solo lugar en unlugar.

Jose Luis Diaz 26 de junio de 2014 15 / 80

Page 29: Técnicas de programación

SOLID Open-closed principle

Open-closed principle

Primera ves enunciada por Ivar Jacobson y luego reexpresada porBertran Meyer en “Object Oriented Software Construction”:

“Las entidades de software (clases, modulos, funciones, etc). Debenestar abiertas para extension, pero cerradas para modificacion”

Esforzarse para hacer que cuando el codigo cambie, solo lugar en unlugar.

Jose Luis Diaz 26 de junio de 2014 15 / 80

Page 30: Técnicas de programación

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) {

10 dibujarCuadrado(((Cuadrado) figura).lado);11 }12 else if (figura instanceof Circle) {13 dibujarCirculo(((Circle) figura).radio);14 }15 }16 }17

18 private void dibujarCirculo(double radio) {}19 private void dibujarCuadrado(double lado) {}20 }

Jose Luis Diaz 26 de junio de 2014 16 / 80

Page 31: Técnicas de programación

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() {10 for (Dibujable figura: figuras) {11 figura.dibujar()12 }13 }14

15 }

Jose Luis Diaz 26 de junio de 2014 17 / 80

Page 32: Técnicas de programación

SOLID Liskov substitution principle

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 18 / 80

Page 33: Técnicas de programación

SOLID Liskov substitution principle

Liskov substitution principle

Propiedad

Propiedad de sustitucion: Si para cada objeto o1 de tipo S hay un objetoo2 de tipo T tal que: para todo programa P que se define en terminos deT, el comportamiento de P no varia cuando o1 es sustituido por o2entonces S es un subtipo de T.

Jose Luis Diaz 26 de junio de 2014 19 / 80

Page 34: Técnicas de programación

SOLID Liskov substitution principle

Una clara violacion 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 }

Jose Luis Diaz 26 de junio de 2014 20 / 80

Page 35: Técnicas de programación

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 compilando7 String y = ys.iterator().next();

Jose Luis Diaz 26 de junio de 2014 20 / 80

Page 36: Técnicas de programación

SOLID Interface segregation principle

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 21 / 80

Page 37: Técnicas de programación

SOLID Interface segregation principle

Interface segregation principle

Propiedad

Ningun cliente tiene que ser forzado a depender de metodos que no utiliza.

Jose Luis Diaz 26 de junio de 2014 22 / 80

Page 38: Técnicas de programación

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 }

10

11 interface TimerClient {12 public void timeOut();13 }

Jose Luis Diaz 26 de junio de 2014 23 / 80

Page 39: Técnicas de programación

SOLID Interface segregation principle

TimerClient

Door TimedDoor

Jose Luis Diaz 26 de junio de 2014 24 / 80

Page 40: Técnicas de programación

SOLID Interface segregation principle

Door

TimedDoor DoorTimerAdapter

TimerClient

Jose Luis Diaz 26 de junio de 2014 25 / 80

Page 41: Técnicas de programación

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) {10

11 }12

13 void TimeOut(int timeOutId) {14 timedDoor.doorTimeOut();15 }16

17 }

Jose Luis Diaz 26 de junio de 2014 26 / 80

Page 42: Técnicas de programación

SOLID Dependency inversion principle

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 27 / 80

Page 43: Técnicas de programación

SOLID Dependency inversion principle

Dependency inversion principle

Propiedad

Deberıamos depender de Abstracciones y no de implenentaciones.

Jose Luis Diaz 26 de junio de 2014 28 / 80

Page 44: Técnicas de programación

SOLID Dependency inversion principle

Dependency inversion principle

Cuando disenamos una API, usualmente lo hacemos pensando en loque la API necesita

Cuando en realidad deberıamos pensar lo que el cliente necesita

Esto invierte la dependencia

Jose Luis Diaz 26 de junio de 2014 29 / 80

Page 45: Técnicas de programación

SOLID Dependency inversion principle

Dependency inversion principle

Cuando disenamos una API, usualmente lo hacemos pensando en loque la API necesita

Cuando en realidad deberıamos pensar lo que el cliente necesita

Esto invierte la dependencia

Jose Luis Diaz 26 de junio de 2014 29 / 80

Page 46: Técnicas de programación

SOLID Dependency inversion principle

Dependency inversion principle

Cuando disenamos una API, usualmente lo hacemos pensando en loque la API necesita

Cuando en realidad deberıamos pensar lo que el cliente necesita

Esto invierte la dependencia

Jose Luis Diaz 26 de junio de 2014 29 / 80

Page 47: Técnicas de programación

Testing

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 30 / 80

Page 48: Técnicas de programación

Testing Test First Development

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 31 / 80

Page 49: Técnicas de programación

Testing Test First Development

Tipos de Tests

Unit Test: Prueba clases y metodos, usualmente corren rapido yayudan a aislar cuando un error ocurre

Integration Test: Prueba el comportamiento de componentes, y susdependencias.

System Test: Prueba el sistema entero.

Jose Luis Diaz 26 de junio de 2014 32 / 80

Page 50: Técnicas de programación

Testing Test First Development

Tipos de Tests

Unit Test: Prueba clases y metodos, usualmente corren rapido yayudan a aislar cuando un error ocurre

Integration Test: Prueba el comportamiento de componentes, y susdependencias.

System Test: Prueba el sistema entero.

Jose Luis Diaz 26 de junio de 2014 32 / 80

Page 51: Técnicas de programación

Testing Test First Development

Tipos de Tests

Unit Test: Prueba clases y metodos, usualmente corren rapido yayudan a aislar cuando un error ocurre

Integration Test: Prueba el comportamiento de componentes, y susdependencias.

System Test: Prueba el sistema entero.

Jose Luis Diaz 26 de junio de 2014 32 / 80

Page 52: Técnicas de programación

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 diseno

No deja de lado el uso de QA, pero ayuda!

Jose Luis Diaz 26 de junio de 2014 33 / 80

Page 53: Técnicas de programación

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 diseno

No deja de lado el uso de QA, pero ayuda!

Jose Luis Diaz 26 de junio de 2014 33 / 80

Page 54: Técnicas de programación

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 diseno

No deja de lado el uso de QA, pero ayuda!

Jose Luis Diaz 26 de junio de 2014 33 / 80

Page 55: Técnicas de programación

Testing Test First Development

Test Driven es Test First

TDD significa diferentes cosas para diferentes personas.

Para nosotros, significa primero Testear

Jose Luis Diaz 26 de junio de 2014 34 / 80

Page 56: Técnicas de programación

Testing Test First Development

Test Driven es Test First

TDD significa diferentes cosas para diferentes personas.

Para nosotros, significa primero Testear

Jose Luis Diaz 26 de junio de 2014 34 / 80

Page 57: Técnicas de programación

Testing Test First Development

¿Testear primero o al final?

Si escribimos los Tests al principio ganamos algo de valor en cadapaso.

Si escribimos los Tests al final, solo tenemos buenas noticias o malasnoticias.

Jose Luis Diaz 26 de junio de 2014 35 / 80

Page 58: Técnicas de programación

Testing Test First Development

¿Testear primero o al final?

Si escribimos los Tests al principio ganamos algo de valor en cadapaso.

Si escribimos los Tests al final, solo tenemos buenas noticias o malasnoticias.

Jose Luis Diaz 26 de junio de 2014 35 / 80

Page 59: Técnicas de programación

Testing Test First Development

¿Como puede ser mas rapido?

Cada clase que se utilice produccion tiene una clase de Test

Cada metodo que se utilice en produccion tiene un metodo de Test

¿Como escribir mas codigo puede ser mas rapido?

Jose Luis Diaz 26 de junio de 2014 36 / 80

Page 60: Técnicas de programación

Testing Test First Development

¿Como puede ser mas rapido?

Cada clase que se utilice produccion tiene una clase de Test

Cada metodo que se utilice en produccion tiene un metodo de Test

¿Como escribir mas codigo puede ser mas rapido?

Jose Luis Diaz 26 de junio de 2014 36 / 80

Page 61: Técnicas de programación

Testing Test First Development

¿Como puede ser mas rapido?

Cada clase que se utilice produccion tiene una clase de Test

Cada metodo que se utilice en produccion tiene un metodo de Test

¿Como escribir mas codigo puede ser mas rapido?

Jose Luis Diaz 26 de junio de 2014 36 / 80

Page 62: Técnicas de programación

Testing Test First Development

¿Que dejamos de hacer?

se vuelven una forma de requerimientos, dejamos de pasar tiempoescribiendo documentos de requerimientos

nos ayudan a encontrar bugs mas rapido, pasamos menos tiempo enel debugger

nos ayudan a integrar codigo, pasamos menos tiempo integrandocodigo

nos dan energıa y confianza

Jose Luis Diaz 26 de junio de 2014 37 / 80

Page 63: Técnicas de programación

Testing Test First Development

¿Que dejamos de hacer?

se vuelven una forma de requerimientos, dejamos de pasar tiempoescribiendo documentos de requerimientos

nos ayudan a encontrar bugs mas rapido, pasamos menos tiempo enel debugger

nos ayudan a integrar codigo, pasamos menos tiempo integrandocodigo

nos dan energıa y confianza

Jose Luis Diaz 26 de junio de 2014 37 / 80

Page 64: Técnicas de programación

Testing Test First Development

¿Que dejamos de hacer?

se vuelven una forma de requerimientos, dejamos de pasar tiempoescribiendo documentos de requerimientos

nos ayudan a encontrar bugs mas rapido, pasamos menos tiempo enel debugger

nos ayudan a integrar codigo, pasamos menos tiempo integrandocodigo

nos dan energıa y confianza

Jose Luis Diaz 26 de junio de 2014 37 / 80

Page 65: Técnicas de programación

Testing Test First Development

¿Que dejamos de hacer?

se vuelven una forma de requerimientos, dejamos de pasar tiempoescribiendo documentos de requerimientos

nos ayudan a encontrar bugs mas rapido, pasamos menos tiempo enel debugger

nos ayudan a integrar codigo, pasamos menos tiempo integrandocodigo

nos dan energıa y confianza

Jose Luis Diaz 26 de junio de 2014 37 / 80

Page 66: Técnicas de programación

Testing Test First Development

Primero testear

Escribir test puede ser incomodo al principio

Con la practica se vuelve mucho mas facil

Nos ayuda a disenar lo que queremos construir

Jose Luis Diaz 26 de junio de 2014 38 / 80

Page 67: Técnicas de programación

Testing Test First Development

Primero testear

Escribir test puede ser incomodo al principio

Con la practica se vuelve mucho mas facil

Nos ayuda a disenar lo que queremos construir

Jose Luis Diaz 26 de junio de 2014 38 / 80

Page 68: Técnicas de programación

Testing Test First Development

Primero testear

Escribir test puede ser incomodo al principio

Con la practica se vuelve mucho mas facil

Nos ayuda a disenar lo que queremos construir

Jose Luis Diaz 26 de junio de 2014 38 / 80

Page 69: Técnicas de programación

Testing Test First Development

Lento mas que rapido

Aprender algo nuevo siempre es difıcil al principio

Una vez que uno se vuelve bueno, se vuelve mucho mas rapido

Equipos usando TDD reportan un incremento de un 2050 % develocidad y un 80 % de reduccion de defectos el primer ano

Jose Luis Diaz 26 de junio de 2014 39 / 80

Page 70: Técnicas de programación

Testing Test First Development

Lento mas que rapido

Aprender algo nuevo siempre es difıcil al principio

Una vez que uno se vuelve bueno, se vuelve mucho mas rapido

Equipos usando TDD reportan un incremento de un 2050 % develocidad y un 80 % de reduccion de defectos el primer ano

Jose Luis Diaz 26 de junio de 2014 39 / 80

Page 71: Técnicas de programación

Testing Test First Development

Lento mas que rapido

Aprender algo nuevo siempre es difıcil al principio

Una vez que uno se vuelve bueno, se vuelve mucho mas rapido

Equipos usando TDD reportan un incremento de un 2050 % develocidad y un 80 % de reduccion de defectos el primer ano

Jose Luis Diaz 26 de junio de 2014 39 / 80

Page 72: Técnicas de programación

Testing Test First Development

Empujar el desarrollo con Test

Escribir Tests antes de escribir la implementacion

Refactor, para mejorar la calidad

Mocks, stubs, y shunts

Inyeccion de dependencias

Jose Luis Diaz 26 de junio de 2014 40 / 80

Page 73: Técnicas de programación

Testing Test First Development

Empujar el desarrollo con Test

Escribir Tests antes de escribir la implementacion

Refactor, para mejorar la calidad

Mocks, stubs, y shunts

Inyeccion de dependencias

Jose Luis Diaz 26 de junio de 2014 40 / 80

Page 74: Técnicas de programación

Testing Test First Development

Empujar el desarrollo con Test

Escribir Tests antes de escribir la implementacion

Refactor, para mejorar la calidad

Mocks, stubs, y shunts

Inyeccion de dependencias

Jose Luis Diaz 26 de junio de 2014 40 / 80

Page 75: Técnicas de programación

Testing Test First Development

Empujar el desarrollo con Test

Escribir Tests antes de escribir la implementacion

Refactor, para mejorar la calidad

Mocks, stubs, y shunts

Inyeccion de dependencias

Jose Luis Diaz 26 de junio de 2014 40 / 80

Page 76: Técnicas de programación

Testing Test First Development

Beneficios de TDD

Enfocarse en buenos principios de diseno

Separacion de responsabilidades: hacerlo funcionar y asegurar calidad

Desarmar tareas complejas en tareas mas simples

Un conjunto completo de Tests de regresion

Jose Luis Diaz 26 de junio de 2014 41 / 80

Page 77: Técnicas de programación

Testing Test First Development

Beneficios de TDD

Enfocarse en buenos principios de diseno

Separacion de responsabilidades: hacerlo funcionar y asegurar calidad

Desarmar tareas complejas en tareas mas simples

Un conjunto completo de Tests de regresion

Jose Luis Diaz 26 de junio de 2014 41 / 80

Page 78: Técnicas de programación

Testing Test First Development

Beneficios de TDD

Enfocarse en buenos principios de diseno

Separacion de responsabilidades: hacerlo funcionar y asegurar calidad

Desarmar tareas complejas en tareas mas simples

Un conjunto completo de Tests de regresion

Jose Luis Diaz 26 de junio de 2014 41 / 80

Page 79: Técnicas de programación

Testing Test First Development

Beneficios de TDD

Enfocarse en buenos principios de diseno

Separacion de responsabilidades: hacerlo funcionar y asegurar calidad

Desarmar tareas complejas en tareas mas simples

Un conjunto completo de Tests de regresion

Jose Luis Diaz 26 de junio de 2014 41 / 80

Page 80: Técnicas de programación

Testing Test First Development

¿Por que funciona?

Nos mantiene enfocado en las tareas adecuadas en el momentoadecuado

Separa las tareas en pedazos manejables

Separa el desarrollo en la forma natural en la que pensamos

Jose Luis Diaz 26 de junio de 2014 42 / 80

Page 81: Técnicas de programación

Testing Test First Development

¿Por que funciona?

Nos mantiene enfocado en las tareas adecuadas en el momentoadecuado

Separa las tareas en pedazos manejables

Separa el desarrollo en la forma natural en la que pensamos

Jose Luis Diaz 26 de junio de 2014 42 / 80

Page 82: Técnicas de programación

Testing Test First Development

¿Por que funciona?

Nos mantiene enfocado en las tareas adecuadas en el momentoadecuado

Separa las tareas en pedazos manejables

Separa el desarrollo en la forma natural en la que pensamos

Jose Luis Diaz 26 de junio de 2014 42 / 80

Page 83: Técnicas de programación

Testing Test First Development

Herramientas para Test unitario

xUnit JUnit para java, NUnit para Net

herramientas de cobertura de codigo

frameworks para Mocking

Jose Luis Diaz 26 de junio de 2014 43 / 80

Page 84: Técnicas de programación

Testing Test First Development

Herramientas para Test unitario

xUnit JUnit para java, NUnit para Net

herramientas de cobertura de codigo

frameworks para Mocking

Jose Luis Diaz 26 de junio de 2014 43 / 80

Page 85: Técnicas de programación

Testing Test First Development

Herramientas para Test unitario

xUnit JUnit para java, NUnit para Net

herramientas de cobertura de codigo

frameworks para Mocking

Jose Luis Diaz 26 de junio de 2014 43 / 80

Page 86: Técnicas de programación

Testing Test First Development

Los tres primeros pasos para testear

Escribir un Test que falle

Hacerlo andar

Refactorizar por calidad

Jose Luis Diaz 26 de junio de 2014 44 / 80

Page 87: Técnicas de programación

Testing Test First Development

Los tres primeros pasos para testear

Escribir un Test que falle

Hacerlo andar

Refactorizar por calidad

Jose Luis Diaz 26 de junio de 2014 44 / 80

Page 88: Técnicas de programación

Testing Test First Development

Los tres primeros pasos para testear

Escribir un Test que falle

Hacerlo andar

Refactorizar por calidad

Jose Luis Diaz 26 de junio de 2014 44 / 80

Page 89: Técnicas de programación

Testing Test First Development

Rojo, Verde

Barra Roja: escribir un metodo que tenga una asercion en como sedeberıa llamar al metodo

Barra Verde: Hacerlo andar!

Refactorizar: Limpiarlo y hacerlo soportale

Repetir

Jose Luis Diaz 26 de junio de 2014 45 / 80

Page 90: Técnicas de programación

Testing Test First Development

Rojo, Verde

Barra Roja: escribir un metodo que tenga una asercion en como sedeberıa llamar al metodo

Barra Verde: Hacerlo andar!

Refactorizar: Limpiarlo y hacerlo soportale

Repetir

Jose Luis Diaz 26 de junio de 2014 45 / 80

Page 91: Técnicas de programación

Testing Test First Development

Rojo, Verde

Barra Roja: escribir un metodo que tenga una asercion en como sedeberıa llamar al metodo

Barra Verde: Hacerlo andar!

Refactorizar: Limpiarlo y hacerlo soportale

Repetir

Jose Luis Diaz 26 de junio de 2014 45 / 80

Page 92: Técnicas de programación

Testing Test First Development

Rojo, Verde

Barra Roja: escribir un metodo que tenga una asercion en como sedeberıa llamar al metodo

Barra Verde: Hacerlo andar!

Refactorizar: Limpiarlo y hacerlo soportale

Repetir

Jose Luis Diaz 26 de junio de 2014 45 / 80

Page 93: Técnicas de programación

Testing Test First Development

Escribir un Test que falle

TDD no es directamente obtener la barra verde, es convertir la barraroja 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 verificacion de un test podrıa ser ver que un test fallo antes defuncionar

Jose Luis Diaz 26 de junio de 2014 46 / 80

Page 94: Técnicas de programación

Testing Test First Development

Escribir un Test que falle

TDD no es directamente obtener la barra verde, es convertir la barraroja 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 verificacion de un test podrıa ser ver que un test fallo antes defuncionar

Jose Luis Diaz 26 de junio de 2014 46 / 80

Page 95: Técnicas de programación

Testing Test First Development

Escribir un Test que falle

TDD no es directamente obtener la barra verde, es convertir la barraroja 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 verificacion de un test podrıa ser ver que un test fallo antes defuncionar

Jose Luis Diaz 26 de junio de 2014 46 / 80

Page 96: Técnicas de programación

Testing Test First Development

Escribir un Test que falle

TDD no es directamente obtener la barra verde, es convertir la barraroja 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 verificacion de un test podrıa ser ver que un test fallo antes defuncionar

Jose Luis Diaz 26 de junio de 2014 46 / 80

Page 97: Técnicas de programación

Testing Test First Development

Celebrar la barra Roja

Los Tests que son mas valiosos son los que fallan.

Tenemos que hacer un monton para obtener la barra roja

Tenemos que pensar que hace el metodo que queremos testearDefinir como lo vamos a llamarDefinir que va a devolver

Jose Luis Diaz 26 de junio de 2014 47 / 80

Page 98: Técnicas de programación

Testing Test First Development

Celebrar la barra Roja

Los Tests que son mas valiosos son los que fallan.

Tenemos que hacer un monton para obtener la barra roja

Tenemos que pensar que hace el metodo que queremos testearDefinir como lo vamos a llamarDefinir que va a devolver

Jose Luis Diaz 26 de junio de 2014 47 / 80

Page 99: Técnicas de programación

Testing Test First Development

Celebrar la barra Roja

Los Tests que son mas valiosos son los que fallan.

Tenemos que hacer un monton para obtener la barra roja

Tenemos que pensar que hace el metodo que queremos testear

Definir como lo vamos a llamarDefinir que va a devolver

Jose Luis Diaz 26 de junio de 2014 47 / 80

Page 100: Técnicas de programación

Testing Test First Development

Celebrar la barra Roja

Los Tests que son mas valiosos son los que fallan.

Tenemos que hacer un monton para obtener la barra roja

Tenemos que pensar que hace el metodo que queremos testearDefinir como lo vamos a llamar

Definir que va a devolver

Jose Luis Diaz 26 de junio de 2014 47 / 80

Page 101: Técnicas de programación

Testing Test First Development

Celebrar la barra Roja

Los Tests que son mas valiosos son los que fallan.

Tenemos que hacer un monton para obtener la barra roja

Tenemos que pensar que hace el metodo que queremos testearDefinir como lo vamos a llamarDefinir que va a devolver

Jose Luis Diaz 26 de junio de 2014 47 / 80

Page 102: Técnicas de programación

Testing Test First Development

Obteniendo la barra verde

Obtener la barra roja esta bien, quedarse ahı no

Obtener la barra verde puede ser facil, quedarse ahı no

Pasos separados:

Hacerlo andarHacerlo mantenible

Jose Luis Diaz 26 de junio de 2014 48 / 80

Page 103: Técnicas de programación

Testing Test First Development

Obteniendo la barra verde

Obtener la barra roja esta bien, quedarse ahı no

Obtener la barra verde puede ser facil, quedarse ahı no

Pasos separados:

Hacerlo andarHacerlo mantenible

Jose Luis Diaz 26 de junio de 2014 48 / 80

Page 104: Técnicas de programación

Testing Test First Development

Obteniendo la barra verde

Obtener la barra roja esta bien, quedarse ahı no

Obtener la barra verde puede ser facil, quedarse ahı no

Pasos separados:

Hacerlo andarHacerlo mantenible

Jose Luis Diaz 26 de junio de 2014 48 / 80

Page 105: Técnicas de programación

Testing Test First Development

Obteniendo la barra verde

Obtener la barra roja esta bien, quedarse ahı no

Obtener la barra verde puede ser facil, quedarse ahı no

Pasos separados:

Hacerlo andar

Hacerlo mantenible

Jose Luis Diaz 26 de junio de 2014 48 / 80

Page 106: Técnicas de programación

Testing Test First Development

Obteniendo la barra verde

Obtener la barra roja esta bien, quedarse ahı no

Obtener la barra verde puede ser facil, quedarse ahı no

Pasos separados:

Hacerlo andarHacerlo mantenible

Jose Luis Diaz 26 de junio de 2014 48 / 80

Page 107: Técnicas de programación

Testing Test First Development

Refactorizar el Codigo

Limpiar la logica, hacerla facil de leer

Renombrar metodos, hacer que reflejen lo que hacen

Eliminar redundancia, encapsular variacion

Jose Luis Diaz 26 de junio de 2014 49 / 80

Page 108: Técnicas de programación

Testing Test First Development

Refactorizar el Codigo

Limpiar la logica, hacerla facil de leer

Renombrar metodos, hacer que reflejen lo que hacen

Eliminar redundancia, encapsular variacion

Jose Luis Diaz 26 de junio de 2014 49 / 80

Page 109: Técnicas de programación

Testing Test First Development

Refactorizar el Codigo

Limpiar la logica, hacerla facil de leer

Renombrar metodos, hacer que reflejen lo que hacen

Eliminar redundancia, encapsular variacion

Jose Luis Diaz 26 de junio de 2014 49 / 80

Page 110: Técnicas de programación

Testing Test First Development

Refactorizar los Tests

Cuando uno esta intentando entender que tiene que hacer,probablemente escriba muchos tests

Este tipo de triangulacion puede ser util

Los Tests extras, borrarlos!

Jose Luis Diaz 26 de junio de 2014 50 / 80

Page 111: Técnicas de programación

Testing Test First Development

Refactorizar los Tests

Cuando uno esta intentando entender que tiene que hacer,probablemente escriba muchos tests

Este tipo de triangulacion puede ser util

Los Tests extras, borrarlos!

Jose Luis Diaz 26 de junio de 2014 50 / 80

Page 112: Técnicas de programación

Testing Test First Development

Refactorizar los Tests

Cuando uno esta intentando entender que tiene que hacer,probablemente escriba muchos tests

Este tipo de triangulacion puede ser util

Los Tests extras, borrarlos!

Jose Luis Diaz 26 de junio de 2014 50 / 80

Page 113: Técnicas de programación

Testing Test First Development

Un ejemplo

Supongamos que quiero escribir una clase “adder”

Empezarıa escribiendo un test que falla

Y el codigo mas simple para que compile

Jose Luis Diaz 26 de junio de 2014 51 / 80

Page 114: Técnicas de programación

Testing Test First Development

Un ejemplo

Supongamos que quiero escribir una clase “adder”

Empezarıa escribiendo un test que falla

Y el codigo mas simple para que compile

Jose Luis Diaz 26 de junio de 2014 51 / 80

Page 115: Técnicas de programación

Testing Test First Development

Un ejemplo

Supongamos que quiero escribir una clase “adder”

Empezarıa escribiendo un test que falla1 Adder adder = new Adder();2 assertEquals(2, adder.add(1,1));

Y el codigo mas simple para que compile

Jose Luis Diaz 26 de junio de 2014 51 / 80

Page 116: Técnicas de programación

Testing Test First Development

Un ejemplo

Supongamos que quiero escribir una clase “adder”

Empezarıa escribiendo un test que falla1 Adder adder = new Adder();2 assertEquals(2, adder.add(1,1));

Y el codigo mas simple para que compile

Jose Luis Diaz 26 de junio de 2014 51 / 80

Page 117: Técnicas de programación

Testing Test First Development

Un ejemplo

Supongamos que quiero escribir una clase “adder”

Empezarıa escribiendo un test que falla1 Adder adder = new Adder();2 assertEquals(2, adder.add(1,1));

Y el codigo mas simple para que compile1 public class Adder {2 public int add(int p1, int p2) {3 return 0;4 }5 }

Jose Luis Diaz 26 de junio de 2014 51 / 80

Page 118: Técnicas de programación

Testing Test First Development

Jose Luis Diaz 26 de junio de 2014 52 / 80

Page 119: Técnicas de programación

Testing Test First Development

Una buena idea

Cual es la forma mas rapida de ir hacia la barra verde?

Jose Luis Diaz 26 de junio de 2014 53 / 80

Page 120: Técnicas de programación

Testing Test First Development

Una buena idea

Cual es la forma mas rapida de ir hacia la barra verde?1 public class Adder {2 public int add(int p1, int p2) {3 return 2;4 }5 }

Jose Luis Diaz 26 de junio de 2014 53 / 80

Page 121: Técnicas de programación

Testing Test First Development

Jose Luis Diaz 26 de junio de 2014 54 / 80

Page 122: Técnicas de programación

Testing Test First Development

Intentemos otro mas

1 assertEquals(4, adder.add(1,1));

Jose Luis Diaz 26 de junio de 2014 55 / 80

Page 123: Técnicas de programación

Testing Test First Development

Jose Luis Diaz 26 de junio de 2014 56 / 80

Page 124: Técnicas de programación

Testing Test First Development

Opciones

Podemos agregar logica condicional

o simplemente

Jose Luis Diaz 26 de junio de 2014 57 / 80

Page 125: Técnicas de programación

Testing Test First Development

Opciones

Podemos agregar logica condicional

o simplemente

Jose Luis Diaz 26 de junio de 2014 57 / 80

Page 126: Técnicas de programación

Testing Test First Development

Opciones

Podemos agregar logica condicional1 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 06 }7 }

o simplemente

Jose Luis Diaz 26 de junio de 2014 57 / 80

Page 127: Técnicas de programación

Testing Test First Development

Opciones

Podemos agregar logica condicional1 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 06 }7 }

o simplemente

Jose Luis Diaz 26 de junio de 2014 57 / 80

Page 128: Técnicas de programación

Testing Test First Development

Opciones

Podemos agregar logica condicional1 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 06 }7 }

o simplemente1 public class Adder {2 public int add(int p1, int p2) {3 return p1+p24 }5 }

Jose Luis Diaz 26 de junio de 2014 57 / 80

Page 129: Técnicas de programación

Testing Test First Development

Jose Luis Diaz 26 de junio de 2014 58 / 80

Page 130: Técnicas de programación

Testing Test First Development

Caracterısticas de un buen test

Corren Rapido, deben tener un setup y un teardown cortos. Los testdeben correr aislados y no deberıa importar el orden en que corran.

Bien nombrados, si una abstraccion no tiene un nombre adecuadoprobablemente este mal

Usar datos que representan como el sistema realmente va a serutilizado

Jose Luis Diaz 26 de junio de 2014 59 / 80

Page 131: Técnicas de programación

Testing Test First Development

Caracterısticas de un buen test

Corren Rapido, deben tener un setup y un teardown cortos. Los testdeben correr aislados y no deberıa importar el orden en que corran.

Bien nombrados, si una abstraccion no tiene un nombre adecuadoprobablemente este mal

Usar datos que representan como el sistema realmente va a serutilizado

Jose Luis Diaz 26 de junio de 2014 59 / 80

Page 132: Técnicas de programación

Testing Test First Development

Caracterısticas de un buen test

Corren Rapido, deben tener un setup y un teardown cortos. Los testdeben correr aislados y no deberıa importar el orden en que corran.

Bien nombrados, si una abstraccion no tiene un nombre adecuadoprobablemente este mal

Usar datos que representan como el sistema realmente va a serutilizado

Jose Luis Diaz 26 de junio de 2014 59 / 80

Page 133: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 134: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 135: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 136: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 137: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 138: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 139: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 140: Técnicas de programación

Testing Test First Development

Algunos TIPS

Hacer que el Test primero falle

Hacer que los Tests corran rapido testeando solo lo que se necesitatestear

No hay que asumir que los test corren en ningun orden

Arrancar con el caso mas simple

Asegurarse que el Test mantiene valida una intencion

Mantener los Tests repetibles

No harcodear locaciones

Hacer los mensajes de error informativos

Jose Luis Diaz 26 de junio de 2014 60 / 80

Page 141: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 142: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 143: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 144: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 145: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 146: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 147: Técnicas de programación

Testing Test First Development

Que es difıcil testear

Metodos que retornan void

Metodos static, o private

Metodos que no son determiniticos

Metodos que no son cohesivos

Jerarquıa de clases profundas

Cuando se construyen objetos en los constructores

Estado global

Jose Luis Diaz 26 de junio de 2014 61 / 80

Page 148: Técnicas de programación

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

Jose Luis Diaz 26 de junio de 2014 62 / 80

Page 149: Técnicas de programación

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

Jose Luis Diaz 26 de junio de 2014 62 / 80

Page 150: Técnicas de programación

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

Jose Luis Diaz 26 de junio de 2014 62 / 80

Page 151: Técnicas de programación

Testing Tecnicas de testing

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 63 / 80

Page 152: Técnicas de programación

Testing Tecnicas de testing

Fases de un test

Setup

Ejercitarlo

Verificarlo

Teardown

Jose Luis Diaz 26 de junio de 2014 64 / 80

Page 153: Técnicas de programación

Testing Tecnicas de testing

Fases de un test

Setup

Ejercitarlo

Verificarlo

Teardown

Jose Luis Diaz 26 de junio de 2014 64 / 80

Page 154: Técnicas de programación

Testing Tecnicas de testing

Fases de un test

Setup

Ejercitarlo

Verificarlo

Teardown

Jose Luis Diaz 26 de junio de 2014 64 / 80

Page 155: Técnicas de programación

Testing Tecnicas de testing

Fases de un test

Setup

Ejercitarlo

Verificarlo

Teardown

Jose Luis Diaz 26 de junio de 2014 64 / 80

Page 156: Técnicas de programación

Testing Tecnicas de testing

Dos tipos de test

Boundary tests: definir condiciones de frontera

Workflow tests: testear una secuencia de eventos

Jose Luis Diaz 26 de junio de 2014 65 / 80

Page 157: Técnicas de programación

Testing Tecnicas de testing

Dos tipos de test

Boundary tests: definir condiciones de frontera

Workflow tests: testear una secuencia de eventos

Jose Luis Diaz 26 de junio de 2014 65 / 80

Page 158: Técnicas de programación

Testing Tecnicas de testing

Dos tipos de test

Boundary tests: definir condiciones de frontera

Workflow tests: testear una secuencia de eventos

Jose Luis Diaz 26 de junio de 2014 65 / 80

Page 159: Técnicas de programación

Testing Tecnicas de testing

Boundary tests

Los tests de fronteras estan expresado por aserciones

Usan algun framework de unit testing

Se aseguran que se retornen valores correctos para determinadosparametros

Jose Luis Diaz 26 de junio de 2014 66 / 80

Page 160: Técnicas de programación

Testing Tecnicas de testing

Boundary tests

Los tests de fronteras estan expresado por aserciones

Usan algun framework de unit testing

Se aseguran que se retornen valores correctos para determinadosparametros

Jose Luis Diaz 26 de junio de 2014 66 / 80

Page 161: Técnicas de programación

Testing Tecnicas de testing

Boundary tests

Los tests de fronteras estan expresado por aserciones

Usan algun framework de unit testing

Se aseguran que se retornen valores correctos para determinadosparametros

Jose Luis Diaz 26 de junio de 2014 66 / 80

Page 162: Técnicas de programación

Testing Tecnicas de testing

Boundary tests

Los tests de fronteras estan expresado por aserciones

Usan algun framework de unit testing

Se aseguran que se retornen valores correctos para determinadosparametros

Jose Luis Diaz 26 de junio de 2014 66 / 80

Page 163: Técnicas de programación

Testing Tecnicas de testing

Workflow Testing

Los test de secuencia usan objetos de tipo Mock para inspeccionar yverificar las llamadas hechas en una secuencia especifica

Usan un framework de mocking

Aseguran que el flujo funciona correctamente

Jose Luis Diaz 26 de junio de 2014 67 / 80

Page 164: Técnicas de programación

Testing Tecnicas de testing

Workflow Testing

Los test de secuencia usan objetos de tipo Mock para inspeccionar yverificar las llamadas hechas en una secuencia especifica

Usan un framework de mocking

Aseguran que el flujo funciona correctamente

Jose Luis Diaz 26 de junio de 2014 67 / 80

Page 165: Técnicas de programación

Testing Tecnicas de testing

Workflow Testing

Los test de secuencia usan objetos de tipo Mock para inspeccionar yverificar las llamadas hechas en una secuencia especifica

Usan un framework de mocking

Aseguran que el flujo funciona correctamente

Jose Luis Diaz 26 de junio de 2014 67 / 80

Page 166: Técnicas de programación

Testing Tecnicas de testing

Workflow Testing

Los test de secuencia usan objetos de tipo Mock para inspeccionar yverificar las llamadas hechas en una secuencia especifica

Usan un framework de mocking

Aseguran que el flujo funciona correctamente

Jose Luis Diaz 26 de junio de 2014 67 / 80

Page 167: Técnicas de programación

Testing Tecnicas de testing

Manejando las dependencias

No todo lo que testeamos esta bajo nuestro control

Necesitamos poder manejar esas dependencias

Como hacemos para testear un webservice?

Jose Luis Diaz 26 de junio de 2014 68 / 80

Page 168: Técnicas de programación

Testing Tecnicas de testing

Manejando las dependencias

No todo lo que testeamos esta bajo nuestro control

Necesitamos poder manejar esas dependencias

Como hacemos para testear un webservice?

Jose Luis Diaz 26 de junio de 2014 68 / 80

Page 169: Técnicas de programación

Testing Tecnicas de testing

Manejando las dependencias

No todo lo que testeamos esta bajo nuestro control

Necesitamos poder manejar esas dependencias

Como hacemos para testear un webservice?

Jose Luis Diaz 26 de junio de 2014 68 / 80

Page 170: Técnicas de programación

Testing Tecnicas de testing

Manejando las dependencias

No todo lo que testeamos esta bajo nuestro control

Necesitamos poder manejar esas dependencias

Como hacemos para testear un webservice?

Jose Luis Diaz 26 de junio de 2014 68 / 80

Page 171: Técnicas de programación

Testing Tecnicas de testing

Mocks hechos a mano

Usualmente es una subclase de la clase que estamos mock-eando oimplementa la misma interface

Contienen metodos para agregar y remover estado

Escritos a mano; no hay necesidad de ningun framework

Jose Luis Diaz 26 de junio de 2014 69 / 80

Page 172: Técnicas de programación

Testing Tecnicas de testing

Mocks hechos a mano

Usualmente es una subclase de la clase que estamos mock-eando oimplementa la misma interface

Contienen metodos para agregar y remover estado

Escritos a mano; no hay necesidad de ningun framework

Jose Luis Diaz 26 de junio de 2014 69 / 80

Page 173: Técnicas de programación

Testing Tecnicas de testing

Mocks hechos a mano

Usualmente es una subclase de la clase que estamos mock-eando oimplementa la misma interface

Contienen metodos para agregar y remover estado

Escritos a mano; no hay necesidad de ningun framework

Jose Luis Diaz 26 de junio de 2014 69 / 80

Page 174: Técnicas de programación

Testing Tecnicas 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

Jose Luis Diaz 26 de junio de 2014 70 / 80

Page 175: Técnicas de programación

Testing Tecnicas 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

Jose Luis Diaz 26 de junio de 2014 70 / 80

Page 176: Técnicas de programación

Testing Tecnicas 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

Jose Luis Diaz 26 de junio de 2014 70 / 80

Page 177: Técnicas de programación

Testing Tecnicas de testing

Mocks inspeccionables

Estos mocks pueden estar condicionados diciendo que deben esperar

Una vez que el mock esta creado, el codigo puede ser testeado

Despues se verifica que las llamadas hayan sido correctas

Jose Luis Diaz 26 de junio de 2014 71 / 80

Page 178: Técnicas de programación

Testing Dependencias

Agenda

1 Principios de disenoOcultacion de la informacionHacia los objetos

2 SOLIDSingle responsibility principleOpen-closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

3 TestingTest First DevelopmentTecnicas de testingDependencias

Jose Luis Diaz 26 de junio de 2014 72 / 80

Page 179: Técnicas de programación

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 }

Jose Luis Diaz 26 de junio de 2014 73 / 80

Page 180: Técnicas de programación

Testing Dependencias

Hacer esto

Delegar la creacion a una Factory1 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 {10 public MyClass(Thread thread, FileWriter fileWriter) throws IOException {11 this.thread = thread;12 this.fileWriter = fileWriter;13 }14 }

Jose Luis Diaz 26 de junio de 2014 74 / 80

Page 181: Técnicas de programación

Testing Dependencias

Inyeccion de dependencias

En esta tecnica pasamos la dependencia en el constructor

Esto nos habilita a pasar tipos cuando lo creamos conveniente

Jose Luis Diaz 26 de junio de 2014 75 / 80

Page 182: Técnicas de programación

Testing Dependencias

Otro ejemplo

1 public class Motorboat {2 private Motor myMotor;3

4 public Motorboat() {5 myMotor = new V6_Cat_motor(); // oculta6 }7

8 }

Jose Luis Diaz 26 de junio de 2014 76 / 80

Page 183: Técnicas de programación

Testing Dependencias

Una opcion

1

2 public Motorboat(Motor aMotor) {3 myMotor = motor;4 }5

6 public Motorboat() {7 myMotor = new V6_Cat_motor();8 }

Jose Luis Diaz 26 de junio de 2014 77 / 80

Page 184: Técnicas de programación

Testing Dependencias

Otra opcion

1 public Motorboat() {2 myMotor = makeMotor();3 }4

5 protected static Motor makeMotor() {6 return new V6_Cat_motor()7 }

Jose Luis Diaz 26 de junio de 2014 78 / 80

Page 185: Técnicas de programación

Testing Dependencias

y una innerclass

1 public class MotorBoardTest {2 private Motorboat testMotorboat;3 static private Motor mockMotor = new MockMotor();4

5 @Before6 public void startupTest() {7 testMotorboat = new TesteableMotorboat();8 }9

10 private class TesteableMotorboat extends Motorboat {11 protected static Motor makeMotor() {12 return mockMotor;13 }14 }15 }

Jose Luis Diaz 26 de junio de 2014 79 / 80

Page 186: Técnicas de programación

Testing Dependencias

Gracias!

Jose Luis Diaz 26 de junio de 2014 80 / 80