SlideShare uma empresa Scribd logo
1 de 120
Introducción a TDD
Enfoque de la Charla
 Presentar un ejemplo de principio a fin
de una funcionalidad de un proyecto.
Sin profundizar en las herramientas
utilizadas. El objetivo es clarificar el
proceso de TDD.
Objetivos de la charla
-- Introducir TDD como una alternativa viable al
desarrollo tradicional.
-- Crear cierta inquietud por profundizar mas en
el tema.
-- Exponer las ventajas que TDD tiene para el
desarrollador.
-- Explicar paso a paso como afrontar una
funcionalidad con esta práctica.
¿Que es TDD?
Practica de desarrollo de software
Test First + Refactor
¿Que ventajas trae TDD al
desarrollador?
• Confianza en el funcionamiento.
• Foco en el desarrollo.
• Código mas limpio. (Buenas practicas de desarrollo y
patrones).
• Menos Bugs y mas localizados.
• Documentación del código con los Tests.
• Menos reinicio del servidor para probar.
Realizar el menor diseño posible
antes de empezar. Solo lo necesario
(Generalmente la Infraestructura de
la aplicación). Los test guiarán el
diseño.
El ciclo de TDD
El ciclo de TDD
RefactoRefactorr
Escribir unEscribir un
test Unitariotest Unitario
que falleque falle
Hacer que elHacer que el
test pasetest pase
Escribir un Test
Funcional Que
falle
Conocido como el ciclo
ROJO->VERDE-
>REFACTOR
¿Cuanto tiempo pueden estar los
tests en rojo?
- - Test Unitarios deben pasar cuanto antes.
- - Test funcionales tardarán mas en pasar. Y estarán en
un ciclo distinto del BUILD.
- - Nunca se subirán tests que fallan al repositorio de
código fuente.
- - Solo se desarrolla funcionalidad cuando exista un Test
fallido que lo requiera.
¿Cuanto del código probar?
- - Probar TODO lo que tenga sentido
probar.
- - No probar lo trivial.
- - Spikes paraThird Party.
- - Cobertura.
¿Como comenzar?.
- - Escoger la funcionalidad (feature)
mas pequeña posible que la
aplicación deba cumplir.
- - Luego ir escogiendo
funcionalidades de nuestro Product
Backlog.
Nuestro ejemplo.
Situación
Inicial
Situación
Final
Iteración 0
¿Que es un test de aceptación o
test funcional?
Nos ayuda a definir exactamente
la funcionalidad que queremos
hacer. Un test define QUE
queremos hacer, si importar
realmente el COMO.
 No debe conocer los objetos
internos del sistema.
 Debe reaccionar ante eventos
que se produzcan en la capa
"visible" (GUI, LOG, etc).
Usualmente haciendo un poll
para ver si hay cambios.
Test Funcional
Prueba la interacción entre distintos
componentes del sistema, o entre el
sistema y componentes externos. Por
ejemplo con la Base de Datos, Con el
sistema de ficheros, etc.
Test Integración
Definimos el Test Funcional.
Selenium
Definimos el Test Funcional.
Selenium. Permite ejecutar Tests
Directamente sobre la interfaz de
usuario HTML, sobre un navegador en
particular. Para esto la aplicación debe
estar iniciada. El proceso de iniciar la
apliciación debe ser automático, previo
a la ejecución de los test, y terminado
luego.
Definimos el Test Funcional.
Este Test podrá estar sin pasar
por mucho tiempo. Nos sirve
como guía de la funcionalidad
final que queremos conseguir.
Prueba comportamientos en
aislamiento TOTAL respecto al
resto del sistema. Prueba una y
solo una caracteristica sin que
los demas elementos del
sistema afecten su ejecución.
Test Unitario
El primer Test Unitario.
 La primera abstracción que se nos ocurre es una Cuenta. En la que podemos
depositar y sacar dinero.
 Hacemos el test para depositar dinero
El primer Test Unitario.
Hacemos el test compilar. Para eso creamos la clase Account y los métodos
necesarios.
El primer test unitario.
El Test Compila.
El primer Test Unitario
Barra roja
El primer Test unitario.
 Implementación Falsa VS Implementación obvia.
 Pasamos el Test con implementación falsa.
Realizamos otro test que nos obligue a sustituir la implementación falsa. Esto es
Triangulación en TDD
El primer Test unitario.
Cambiamos la implementación
El primer Test unitario.
La barra verde nuevamente
El primer Test unitario.
 Cuando se sepa claramente la
implementación obvia, aplicarla.
 No es necesario siempre dar los pasos
mas pequeños posibles.
 Si la implementación obvia resulta no
ser tan obvia, y al implementarla los
test fallan. Hacer los pasos mas
pequeños posibles.
El primer Test unitario.
Es importante hacer tests para
situaciones que esperamos
produzcan un error.
Probando los fallos.
Probando los fallos.
Hemos creado por TDD lo siguiente en AccountTest y Account para
el retiro de dinero.
Sin embargo como requerimiento tenemos que no podemos dejar
una cuenta a un numero negativo. Por tanto hay que comprobar que
esto no se pueda dar.
Probando los fallos.
Con esto decimos que esperamos que al producirse esta
situación (Rerirar mas de lo que tenemos), se eleve la excepción
WithdrawlException (Que aun no existe).
Probando los fallos.
Creamos la excepción. Nuestro Test Compila
Probando los fallos.
Ejecutamos el Test. Barra Roja
Añadimos la implementación obvia. Ejecutamos. Barra Verde.
Probando los fallos.
Probando los fallos.
Refactorizamos con un sencillo Extract Method. Ejecutamos. Barra Verde.
Continuando con Account.
Soporte de Divisas
La siguiente caracterisitac que deben soportar nuestras
cuentas, es que pueden estar en EUR, USD o GBP.
Comenzamos con el TEST.
Continuando con Account.
Soporte de Divisas.
Cuando uno crea un Test, la idea es imaginar el API
mas correcto de lo que estamos creando. En este caso
nos damos cuenta que una Cuenta DEBE tener una
divisa. Por lo que la ponemos en le constructor.
Hacemos los cambios necesarios a
Account para que compile y damos la
solución obvia. Nuestros Tests anteriores
ya no compilan (requerían constructor
vacio). Cambiamos la construcción de
las Accounts para el nuevo constructor.
Ejecutamos los Tests. Barra verde.
Continuando con Account.
Soporte de Divisas.
Es muy importante ejecutar TODA la suite de
Tests cuando se hacen cambios y
refactorizaciones. Ya que aunque en el caso
anterior se detectó en compilación el fallo (La
falta de constructor). Muchas veces un
cambió hará que cosas que asumiamos
como correctas ya no lo sean. Y habrá que
adaptar los Tests y el código a la nueva
solución.
Continuando con Account.
Soporte de Divisas.
Refactorización
Uno de los mas importantes "Code Smells", es
el hecho de utilizar Strings para representar
cosas que son mas que texto y tienen
significado propio. En nuestro caso, el String
que se pasa al constructor.
Creamos un ENUM para representar nuestras
divisas. Adaptamos los Tests. Barra Verde
Continuando con Account.
Soporte de Divisas.
Continuando con Account.
Soporte de Divisas.
 Añadimos también, por comodidad un constructor que aparte
de la divisa, se le pueda enviar también el balance inicial.
Continuando con Account.
Soporte de Divisas.
Probando el servicio de
transferencia.
Dejando Account a un lado, considerandolo terminado, nos
centramos en el servicio de transferencia.
Para nosotros una transferencia será sencillamente, retirar de
una cuenta, y depositar en otra.
El primer test que se nos ocurre es hacer una transferencia
entre 2 cuentas con la misma divisa.
Probando el servicio de
transferencia.
El código anterior es lo primero que se
nos ocurre realizar. Sin embargo,
viendo la interfaz del método transfer,
los parámetros se prestan a confusión.
¿De que cuenta a que cuenta es la
transferencia?
Probando el servicio de
transferencia.
Decidimos que un mejor diseño es encapsular la transferencia
es su propio objeto y pasar este objeto al metodo transfer.
Probando el servicio de
transferencia.
La TransferOperation es mucho mas especifica. Creamos las
clases que nos faltan
Probando el servicio de
transferencia.
Ejecutamos nuestro Test. Barra Roja!!.
Probando el servicio de
transferencia.
Haciendo una inspección de que puede estar fallando, nos damos
cuenta que el error no esta en el servicio, ni en el Test.. sino en
Account (Podriamos hacer un mock temporal de la clase account y
ver que se llaman al deposit y withdrawal correctamente. Pero el
servicio es muy simple y resulta obvio). Clase que habiamos dada
por terminada. Vemos que el problema está en el metodo deposit.
Por no haber triangulado lo suficiente en las pruebas.
Probando el servicio de
transferencia.
Prueba de Regresión. Se reporta un Error
(Bug) por una funcionalidad dada por cerrada
y que por falta de input no se hizo el test
adecuado. Normalmente la falta de input es
por requerimientos no entendidos
completamente. En nuestro caso es que no
hicimos todas las pruebas que debimos.

Probando el servicio de
transferencia.
Vamos a AcountTest. y agregamos un Test para el error que
hemos obtenido. Barra Roja
Probando el servicio de
transferencia.
Vamos a la clase Account e implementamos de forma correcta
(que al menos pase este test que es lo que entendemos por
correcto) el metodo deposit.
Probando el servicio de
transferencia.
Ejecutamos nuestro Test AccountTest. Barra Roja otra vez.
Probando el servicio de
transferencia.
Vemos que ahora el balance es null en deposit cuando aun no
se ha depositado nada. La ejecución de los Tests, siempre va a
capturar comportamientos no deseados como este, si se hacen
los tests correctos.
Corregimos Account y ejecutamos el Test. Barra Verde. Al fin.
Probando el servicio de
transferencia.
Regresamos al punto donde realmente estabamos. En
TransferTest. Lo ejecutamos. Barra Verde.
Probando el servicio de
transferencia.
Refactoring.
La forma de construir la TransferOperation no es del todo agradable. sustituimos los
setters actuales por un semi-builder mas intutitivo y comodo, definido con un DSL propio.
Cambiamos el Test a como realmente queremos que luzca la llamada.
Probando el servicio de
transferencia.
Cambiamos el codigo de TransferOperation,
Ejecutamos el Test, Barra Verde.
Transferencias entre 2 monedas distintas.
Diseñamos nuestro Test. Primera aproximación.
Sin factor de conversión. Barra Verde
Probando el servicio de
transferencia.
Transferencias entre 2 monedas distintas.
Con factor de conversión. Primera aproximación
Probando el servicio de
transferencia.
Transferencias entre 2 monedas distintas.
Con factor de conversión. Primera aproximacion. Hacemos
compilar el codigo. Ejecutamos. Barra roja
Probando el servicio de
transferencia.
Transferencias entre 2 monedas distintas.
Con factor de conversión. Primera aproximación.
Implementamos.
Probando el servicio de
transferencia.
Transferencias entre 2 monedas distintas.
Con factor de conversión. Primera aproximación. Ejecutamos los Tests. Barra Roja
Probando el servicio de
transferencia.
Transferencias entre 2 monedas distintas. Se arregla el bug que
se acaba de introducir. Ejcutamos los Test. Barra Verde. (Ojo
tambien habría que verificar, con test que los valores están
metidos en el mapa de conversionRates)
Probando el servicio de
transferencia.
Transferencias entre 2 monedas distintas. Refactorización SRP.
Necesitamos otro servicio, Currency Service que se ocupe de la
conversión. TransferService solo sabe de transferencias.
Probando el servicio de
transferencia.
Creamos la implementación extrayendo una clase nueva de
TransferServiceImpl.
 Incluimos la dependencia en Transfer
Service para que utilice la nueva
dependencia.
Ejecutamos CurrencyTest. Barra Verde. Sin emabrgo luego de
una amplia refactorización como la hecha es necesario ejecutar
toda la suite de tests para verificar que todo está correcto.
Transfer Test se ha roto con la
refactorización, ya que se ha incluido
una nueva dependencia que no
habiamos considerado cuando hicimos
el servicio. Debemos adaptar nuestro
Test a esta nueva casuistica.
 En el caso anterior en realidad se debía
hacer el test antes de añadir la
dependencia a la clase
implementación.
 Siempre se debe atender primero al
Test según los requerimientos y el
comportamiento que se quiere lograr
Mock Objects
 Introduciremos un Mock para la
dependencia.
 ¿Qué es un Mock Object?
Mock Object. Mock hecho a mano
JMOCK
Nos permite con un lenguaje
especifico de dominio definir
Dobles de objetos para
nuestros Test, y establecer las
expectativas sobre estos
objetos.
Mock con Jmock. Y expectativas.
Ejecutamos todos los tests. Barra verde
El uso de mocks
El uso de mocks
Se puede establecer su necesidad en
cualquiera de los dos tiempos de
diseño. Escribir el Test, o la
refactorización.
Refactorizando CurrencyService. Ese
mapa de mapas es muy lioso. Se nos
ocurre mover la responsabilidad de
saber el rate de cambio a la propia
divisa.
 Para hacer esto decidimos también
conversión establecer Rates a una divisa
única y utilizar esta para los cambios.
Usamos el Dólar.
Escribimos los Tests (En realidad se escribieron 1 a
1 estos tests). Y Ejecutamos, Barra Roja.
Implementamos
Ejecutamos los tests. Green Bar
Refactorizamos CurrencyService
Persistiendo los cambios
Persistiendo los cambios. Servicio de persistencia de cuentas. Mock del Dao en Las transferencias. TDD.
AccountService debe permitir persistir cuentas. No compila. Añadimos una nueva propiedad a la clase Account. El identificador.
AccountNumber. Aqui incluimos el mock antes de implementar nada. Sabemos que por buena practica el Servicio no irá directo
contra Repositorio.
Persistiendo los cambios
 - Diseñamos el Test con las
dependencias en Mente.
 - Nos damos cuenta de la necesidad de
un identificador de cuenta. Y lo
incluimos en nuestro Test.
 - Siempre pensar en como queremos
invocar a nuestras APIs
Lo hacemos compilar. Implementamos en account service.
Ejecutamos el test. Barra Verde.
Test Driving el DAO. Test de
Integración.
Ahora haremos la implementación
del DAO guiado por tests.
Exactamente igual que como hasta
ahora. Solo que ahora interactuamos
con elemento externo. La Base de
Datos, o sistema de ficheros. Pero
empecemos por el test.
Utilizaremos el poderoso Spring Test Context para las pruebas de
integración. (Las siguientes pruebas se hicieron 1 a 1).
Implementamos (En realidad lo anterior
se hizo test a test. Pero para recortar lo
ponemos todo de hecho con la primera
ejecución nos dimos cuenta que
Account debía ser serializable y
debiamos implementar el equals y el
hashcode para comparar Accounts) .
En algunos casos, los tests de integración son bastante mas
lentos que los tests unitarios como vemos.
Ejecutamos la suite entera de tests
Persistiendo las
transferencias
El servicio de transferencias ahora mismo no
persiste los datos. Debemos añadir esto a nuestra
aplicación. Lo añadimos en el Test, lo hacemos
compilar, y lo implementamos en el servicio. Con el
mismo procedimiento paso a paso hecho hasta ahora.
Al final obtenemos el siguiente resultado. Obteniendo
la barra verde.
Ejecutamos. Barra Verde
TDD el controlador.
Se basa en los mismos procedimientos que
el probar las otras capas. Centrarnos en la
funcionalidad requerida, y simular los demas
componentes. Las dependencias. Sabemos
que trabajaremos con Controllers de Spring.
Lo primero que haremos será la
funcionalidad para presentar el formulario.
TDD El controlador.
Lo hacemos compilar.Ejecutamos. Barra Roja
TDD el controlador
Implementamos. Ejecutamos el Test. Barra Verde. En principio
no hay refactorización que hacer.
TDD el controlador. El submit del formulario
Mocking HttpServletRequest.
TDD el controlador. Implementamos. Barra Verde.
Ejecutamos la Suite Entera de
Tests. Barra Verde.
El test funcional. Creamos las JSPs requeridas segun nuestros Test, nuestro
controller y nuestro conocimiento de Spring MVC.
Transfer.jsp
transferResult.jsp
Todo dentro del Test
 El Test funcional idealmente es capaz
de iniciar todo su entorno. En nuestro
caso iniciamos el Tomcat.
Utilizamos Cargo para controlar el servidor.
Preparando para el Test Funcional
Las 2 fases del BUILD
Ejecutando el Test Funcional. Incluimos Un setup Completo en el test que inicia el
servidor tomcat.
Ejecutamos la Suite Entera
 Incluyendo Funcionales
Las 2 Fases del BUILD
 En un entorno de integración continua.
 Mvn test: Ejecuta los Tests unitarios, se
ejecutara en cada momento
 Mvn integration-test: Ejecuta los Tests
funcionales. 2 veces al dia.
Revisando el Code Coverage
 Cobertura.
 Mvn site
 Mas que medir la cobertura por
porcentaje. Estar conscientes de que
hemos probado lo necesario.
Reporte del Ejemplo
PACKAGE CLASES LINE COVERAGE
ALL PACKAGES 16 75%
ORG.PT.TDD 1 92%
ORG.PT.TDD.DAO 2 75%
ORG.PT.TDD.DOMAIN 3 69%
ORG.PT.TDD.EXCEPTI
ON
3 50%
ORG.PT.TDD.FORM 1 100%
ORG.PT.TDD.SERVICE 6 90%
Cobertura
136/179
15/20
26/28
64/92
6 12
18/20
7/7
Cobertura
Cobertura
Conclusiones
-- TDD nos ayudan a mantener el foco de lo
que queremos desarrollar.
-- TDD nos sirve como red de seguridad para
atrapar Bugs lo antes posible.
-- TDD nos da seguridad de que lo que
desarrollamos funciona.
Bibliografía
Preguntas

Mais conteúdo relacionado

Semelhante a Seminario de Test Development Driven

Vuelta_a_los_origines_Testing.pdf
Vuelta_a_los_origines_Testing.pdfVuelta_a_los_origines_Testing.pdf
Vuelta_a_los_origines_Testing.pdfPabloMorales831994
 
Pruebas de software
Pruebas de softwarePruebas de software
Pruebas de softwareGomez Gomez
 
Meetup: Sesion #1 Unit Testing & Simian Army
Meetup: Sesion #1 Unit Testing & Simian ArmyMeetup: Sesion #1 Unit Testing & Simian Army
Meetup: Sesion #1 Unit Testing & Simian ArmyOsvaldo Mercado Coss
 
Como escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDDComo escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDDHernan Wilkinson
 
Unit Testing with Mock Objects
Unit Testing with Mock ObjectsUnit Testing with Mock Objects
Unit Testing with Mock ObjectsAngel Nuñez
 
Cypress en un mundo lleno de Selenium
Cypress en un mundo lleno de SeleniumCypress en un mundo lleno de Selenium
Cypress en un mundo lleno de SeleniumSoftware Guru
 
Taller casos de prueba
Taller casos de pruebaTaller casos de prueba
Taller casos de pruebaAndrés Grosso
 
Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1Cein
 
Aguirre Jimenez
Aguirre JimenezAguirre Jimenez
Aguirre JimenezFARIDROJAS
 
Tdd con PHPUnit y netbeans
Tdd con PHPUnit y netbeansTdd con PHPUnit y netbeans
Tdd con PHPUnit y netbeanschabal
 

Semelhante a Seminario de Test Development Driven (20)

Vuelta_a_los_origines_Testing.pdf
Vuelta_a_los_origines_Testing.pdfVuelta_a_los_origines_Testing.pdf
Vuelta_a_los_origines_Testing.pdf
 
Pruebas de software
Pruebas de softwarePruebas de software
Pruebas de software
 
Meetup: Sesion #1 Unit Testing & Simian Army
Meetup: Sesion #1 Unit Testing & Simian ArmyMeetup: Sesion #1 Unit Testing & Simian Army
Meetup: Sesion #1 Unit Testing & Simian Army
 
Como escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDDComo escribir buenos tests al hacer TDD
Como escribir buenos tests al hacer TDD
 
Calidad del software cap3
Calidad del software   cap3Calidad del software   cap3
Calidad del software cap3
 
S9-DAW-2022S1.pptx
S9-DAW-2022S1.pptxS9-DAW-2022S1.pptx
S9-DAW-2022S1.pptx
 
Qunit CookBook español
Qunit CookBook españolQunit CookBook español
Qunit CookBook español
 
software testing
software testingsoftware testing
software testing
 
Introducción a tdd
Introducción a tddIntroducción a tdd
Introducción a tdd
 
Unit Testing with Mock Objects
Unit Testing with Mock ObjectsUnit Testing with Mock Objects
Unit Testing with Mock Objects
 
Cypress en un mundo lleno de Selenium
Cypress en un mundo lleno de SeleniumCypress en un mundo lleno de Selenium
Cypress en un mundo lleno de Selenium
 
Aw agiles2010 - dppt 1.1
Aw agiles2010 - dppt 1.1Aw agiles2010 - dppt 1.1
Aw agiles2010 - dppt 1.1
 
Taller casos de prueba
Taller casos de pruebaTaller casos de prueba
Taller casos de prueba
 
Calidad del software cap2
Calidad del software   cap2Calidad del software   cap2
Calidad del software cap2
 
Unidad ii. tdd
Unidad ii. tddUnidad ii. tdd
Unidad ii. tdd
 
Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1Cesnavarra 2009-boletín 1
Cesnavarra 2009-boletín 1
 
7iSF-4 test driver development
7iSF-4   test driver development7iSF-4   test driver development
7iSF-4 test driver development
 
Aguirre Jimenez
Aguirre JimenezAguirre Jimenez
Aguirre Jimenez
 
Tdd con PHPUnit y netbeans
Tdd con PHPUnit y netbeansTdd con PHPUnit y netbeans
Tdd con PHPUnit y netbeans
 
Toi Tdd 20080409
Toi Tdd 20080409Toi Tdd 20080409
Toi Tdd 20080409
 

Mais de Paradigma Digital

Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Paradigma Digital
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the futureParadigma Digital
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxParadigma Digital
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixParadigma Digital
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API ManagementParadigma Digital
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxParadigma Digital
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microserviciosParadigma Digital
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalParadigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!Paradigma Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octParadigma Digital
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJavaParadigma Digital
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?Paradigma Digital
 

Mais de Paradigma Digital (20)

Ddd + ah + microservicios
Ddd + ah + microserviciosDdd + ah + microservicios
Ddd + ah + microservicios
 
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
 
Have you met Istio?
Have you met Istio?Have you met Istio?
Have you met Istio?
 
Linkerd a fondo
Linkerd a fondoLinkerd a fondo
Linkerd a fondo
 
Horneando apis
Horneando apisHorneando apis
Horneando apis
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the future
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFlux
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace Netflix
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API Management
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microservicios
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
 
Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 
Cómo usar google analytics
Cómo usar google analyticsCómo usar google analytics
Cómo usar google analytics
 
Transformación Digital
Transformación DigitalTransformación Digital
Transformación Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4oct
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJava
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?
 

Último

GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramDIDIERFERNANDOGUERRE
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 

Último (20)

GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ram
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 

Seminario de Test Development Driven

  • 2. Enfoque de la Charla  Presentar un ejemplo de principio a fin de una funcionalidad de un proyecto. Sin profundizar en las herramientas utilizadas. El objetivo es clarificar el proceso de TDD.
  • 3. Objetivos de la charla -- Introducir TDD como una alternativa viable al desarrollo tradicional. -- Crear cierta inquietud por profundizar mas en el tema. -- Exponer las ventajas que TDD tiene para el desarrollador. -- Explicar paso a paso como afrontar una funcionalidad con esta práctica.
  • 4. ¿Que es TDD? Practica de desarrollo de software Test First + Refactor
  • 5. ¿Que ventajas trae TDD al desarrollador? • Confianza en el funcionamiento. • Foco en el desarrollo. • Código mas limpio. (Buenas practicas de desarrollo y patrones). • Menos Bugs y mas localizados. • Documentación del código con los Tests. • Menos reinicio del servidor para probar.
  • 6. Realizar el menor diseño posible antes de empezar. Solo lo necesario (Generalmente la Infraestructura de la aplicación). Los test guiarán el diseño. El ciclo de TDD
  • 7. El ciclo de TDD RefactoRefactorr Escribir unEscribir un test Unitariotest Unitario que falleque falle Hacer que elHacer que el test pasetest pase Escribir un Test Funcional Que falle
  • 8. Conocido como el ciclo ROJO->VERDE- >REFACTOR
  • 9. ¿Cuanto tiempo pueden estar los tests en rojo? - - Test Unitarios deben pasar cuanto antes. - - Test funcionales tardarán mas en pasar. Y estarán en un ciclo distinto del BUILD. - - Nunca se subirán tests que fallan al repositorio de código fuente. - - Solo se desarrolla funcionalidad cuando exista un Test fallido que lo requiera.
  • 10. ¿Cuanto del código probar? - - Probar TODO lo que tenga sentido probar. - - No probar lo trivial. - - Spikes paraThird Party. - - Cobertura.
  • 11. ¿Como comenzar?. - - Escoger la funcionalidad (feature) mas pequeña posible que la aplicación deba cumplir. - - Luego ir escogiendo funcionalidades de nuestro Product Backlog.
  • 14. ¿Que es un test de aceptación o test funcional? Nos ayuda a definir exactamente la funcionalidad que queremos hacer. Un test define QUE queremos hacer, si importar realmente el COMO.
  • 15.  No debe conocer los objetos internos del sistema.  Debe reaccionar ante eventos que se produzcan en la capa "visible" (GUI, LOG, etc). Usualmente haciendo un poll para ver si hay cambios. Test Funcional
  • 16. Prueba la interacción entre distintos componentes del sistema, o entre el sistema y componentes externos. Por ejemplo con la Base de Datos, Con el sistema de ficheros, etc. Test Integración
  • 17. Definimos el Test Funcional. Selenium
  • 18. Definimos el Test Funcional. Selenium. Permite ejecutar Tests Directamente sobre la interfaz de usuario HTML, sobre un navegador en particular. Para esto la aplicación debe estar iniciada. El proceso de iniciar la apliciación debe ser automático, previo a la ejecución de los test, y terminado luego.
  • 19.
  • 20. Definimos el Test Funcional. Este Test podrá estar sin pasar por mucho tiempo. Nos sirve como guía de la funcionalidad final que queremos conseguir.
  • 21. Prueba comportamientos en aislamiento TOTAL respecto al resto del sistema. Prueba una y solo una caracteristica sin que los demas elementos del sistema afecten su ejecución. Test Unitario
  • 22. El primer Test Unitario.  La primera abstracción que se nos ocurre es una Cuenta. En la que podemos depositar y sacar dinero.  Hacemos el test para depositar dinero
  • 23. El primer Test Unitario. Hacemos el test compilar. Para eso creamos la clase Account y los métodos necesarios.
  • 24. El primer test unitario. El Test Compila.
  • 25. El primer Test Unitario Barra roja
  • 26. El primer Test unitario.  Implementación Falsa VS Implementación obvia.  Pasamos el Test con implementación falsa.
  • 27. Realizamos otro test que nos obligue a sustituir la implementación falsa. Esto es Triangulación en TDD El primer Test unitario.
  • 28. Cambiamos la implementación El primer Test unitario.
  • 29. La barra verde nuevamente El primer Test unitario.
  • 30.  Cuando se sepa claramente la implementación obvia, aplicarla.  No es necesario siempre dar los pasos mas pequeños posibles.  Si la implementación obvia resulta no ser tan obvia, y al implementarla los test fallan. Hacer los pasos mas pequeños posibles. El primer Test unitario.
  • 31. Es importante hacer tests para situaciones que esperamos produzcan un error. Probando los fallos.
  • 32. Probando los fallos. Hemos creado por TDD lo siguiente en AccountTest y Account para el retiro de dinero. Sin embargo como requerimiento tenemos que no podemos dejar una cuenta a un numero negativo. Por tanto hay que comprobar que esto no se pueda dar.
  • 33. Probando los fallos. Con esto decimos que esperamos que al producirse esta situación (Rerirar mas de lo que tenemos), se eleve la excepción WithdrawlException (Que aun no existe).
  • 34. Probando los fallos. Creamos la excepción. Nuestro Test Compila
  • 35. Probando los fallos. Ejecutamos el Test. Barra Roja
  • 36. Añadimos la implementación obvia. Ejecutamos. Barra Verde. Probando los fallos.
  • 37. Probando los fallos. Refactorizamos con un sencillo Extract Method. Ejecutamos. Barra Verde.
  • 38. Continuando con Account. Soporte de Divisas La siguiente caracterisitac que deben soportar nuestras cuentas, es que pueden estar en EUR, USD o GBP. Comenzamos con el TEST.
  • 39. Continuando con Account. Soporte de Divisas. Cuando uno crea un Test, la idea es imaginar el API mas correcto de lo que estamos creando. En este caso nos damos cuenta que una Cuenta DEBE tener una divisa. Por lo que la ponemos en le constructor.
  • 40. Hacemos los cambios necesarios a Account para que compile y damos la solución obvia. Nuestros Tests anteriores ya no compilan (requerían constructor vacio). Cambiamos la construcción de las Accounts para el nuevo constructor. Ejecutamos los Tests. Barra verde. Continuando con Account. Soporte de Divisas.
  • 41.
  • 42. Es muy importante ejecutar TODA la suite de Tests cuando se hacen cambios y refactorizaciones. Ya que aunque en el caso anterior se detectó en compilación el fallo (La falta de constructor). Muchas veces un cambió hará que cosas que asumiamos como correctas ya no lo sean. Y habrá que adaptar los Tests y el código a la nueva solución. Continuando con Account. Soporte de Divisas.
  • 43. Refactorización Uno de los mas importantes "Code Smells", es el hecho de utilizar Strings para representar cosas que son mas que texto y tienen significado propio. En nuestro caso, el String que se pasa al constructor. Creamos un ENUM para representar nuestras divisas. Adaptamos los Tests. Barra Verde Continuando con Account. Soporte de Divisas.
  • 45.  Añadimos también, por comodidad un constructor que aparte de la divisa, se le pueda enviar también el balance inicial. Continuando con Account. Soporte de Divisas.
  • 46. Probando el servicio de transferencia. Dejando Account a un lado, considerandolo terminado, nos centramos en el servicio de transferencia. Para nosotros una transferencia será sencillamente, retirar de una cuenta, y depositar en otra.
  • 47. El primer test que se nos ocurre es hacer una transferencia entre 2 cuentas con la misma divisa. Probando el servicio de transferencia.
  • 48. El código anterior es lo primero que se nos ocurre realizar. Sin embargo, viendo la interfaz del método transfer, los parámetros se prestan a confusión. ¿De que cuenta a que cuenta es la transferencia? Probando el servicio de transferencia.
  • 49. Decidimos que un mejor diseño es encapsular la transferencia es su propio objeto y pasar este objeto al metodo transfer. Probando el servicio de transferencia.
  • 50. La TransferOperation es mucho mas especifica. Creamos las clases que nos faltan Probando el servicio de transferencia.
  • 51. Ejecutamos nuestro Test. Barra Roja!!. Probando el servicio de transferencia.
  • 52. Haciendo una inspección de que puede estar fallando, nos damos cuenta que el error no esta en el servicio, ni en el Test.. sino en Account (Podriamos hacer un mock temporal de la clase account y ver que se llaman al deposit y withdrawal correctamente. Pero el servicio es muy simple y resulta obvio). Clase que habiamos dada por terminada. Vemos que el problema está en el metodo deposit. Por no haber triangulado lo suficiente en las pruebas. Probando el servicio de transferencia.
  • 53. Prueba de Regresión. Se reporta un Error (Bug) por una funcionalidad dada por cerrada y que por falta de input no se hizo el test adecuado. Normalmente la falta de input es por requerimientos no entendidos completamente. En nuestro caso es que no hicimos todas las pruebas que debimos.  Probando el servicio de transferencia.
  • 54. Vamos a AcountTest. y agregamos un Test para el error que hemos obtenido. Barra Roja Probando el servicio de transferencia.
  • 55. Vamos a la clase Account e implementamos de forma correcta (que al menos pase este test que es lo que entendemos por correcto) el metodo deposit. Probando el servicio de transferencia.
  • 56. Ejecutamos nuestro Test AccountTest. Barra Roja otra vez. Probando el servicio de transferencia.
  • 57. Vemos que ahora el balance es null en deposit cuando aun no se ha depositado nada. La ejecución de los Tests, siempre va a capturar comportamientos no deseados como este, si se hacen los tests correctos. Corregimos Account y ejecutamos el Test. Barra Verde. Al fin. Probando el servicio de transferencia.
  • 58. Regresamos al punto donde realmente estabamos. En TransferTest. Lo ejecutamos. Barra Verde. Probando el servicio de transferencia.
  • 59. Refactoring. La forma de construir la TransferOperation no es del todo agradable. sustituimos los setters actuales por un semi-builder mas intutitivo y comodo, definido con un DSL propio. Cambiamos el Test a como realmente queremos que luzca la llamada. Probando el servicio de transferencia.
  • 60. Cambiamos el codigo de TransferOperation, Ejecutamos el Test, Barra Verde.
  • 61. Transferencias entre 2 monedas distintas. Diseñamos nuestro Test. Primera aproximación. Sin factor de conversión. Barra Verde Probando el servicio de transferencia.
  • 62. Transferencias entre 2 monedas distintas. Con factor de conversión. Primera aproximación Probando el servicio de transferencia.
  • 63. Transferencias entre 2 monedas distintas. Con factor de conversión. Primera aproximacion. Hacemos compilar el codigo. Ejecutamos. Barra roja Probando el servicio de transferencia.
  • 64. Transferencias entre 2 monedas distintas. Con factor de conversión. Primera aproximación. Implementamos. Probando el servicio de transferencia.
  • 65. Transferencias entre 2 monedas distintas. Con factor de conversión. Primera aproximación. Ejecutamos los Tests. Barra Roja Probando el servicio de transferencia.
  • 66. Transferencias entre 2 monedas distintas. Se arregla el bug que se acaba de introducir. Ejcutamos los Test. Barra Verde. (Ojo tambien habría que verificar, con test que los valores están metidos en el mapa de conversionRates) Probando el servicio de transferencia.
  • 67. Transferencias entre 2 monedas distintas. Refactorización SRP. Necesitamos otro servicio, Currency Service que se ocupe de la conversión. TransferService solo sabe de transferencias. Probando el servicio de transferencia.
  • 68. Creamos la implementación extrayendo una clase nueva de TransferServiceImpl.
  • 69.  Incluimos la dependencia en Transfer Service para que utilice la nueva dependencia.
  • 70. Ejecutamos CurrencyTest. Barra Verde. Sin emabrgo luego de una amplia refactorización como la hecha es necesario ejecutar toda la suite de tests para verificar que todo está correcto.
  • 71. Transfer Test se ha roto con la refactorización, ya que se ha incluido una nueva dependencia que no habiamos considerado cuando hicimos el servicio. Debemos adaptar nuestro Test a esta nueva casuistica.
  • 72.  En el caso anterior en realidad se debía hacer el test antes de añadir la dependencia a la clase implementación.  Siempre se debe atender primero al Test según los requerimientos y el comportamiento que se quiere lograr
  • 73. Mock Objects  Introduciremos un Mock para la dependencia.  ¿Qué es un Mock Object?
  • 74. Mock Object. Mock hecho a mano
  • 75. JMOCK Nos permite con un lenguaje especifico de dominio definir Dobles de objetos para nuestros Test, y establecer las expectativas sobre estos objetos.
  • 76. Mock con Jmock. Y expectativas. Ejecutamos todos los tests. Barra verde
  • 77. El uso de mocks El uso de mocks Se puede establecer su necesidad en cualquiera de los dos tiempos de diseño. Escribir el Test, o la refactorización.
  • 78. Refactorizando CurrencyService. Ese mapa de mapas es muy lioso. Se nos ocurre mover la responsabilidad de saber el rate de cambio a la propia divisa.
  • 79.  Para hacer esto decidimos también conversión establecer Rates a una divisa única y utilizar esta para los cambios. Usamos el Dólar.
  • 80. Escribimos los Tests (En realidad se escribieron 1 a 1 estos tests). Y Ejecutamos, Barra Roja.
  • 82. Ejecutamos los tests. Green Bar Refactorizamos CurrencyService
  • 83. Persistiendo los cambios Persistiendo los cambios. Servicio de persistencia de cuentas. Mock del Dao en Las transferencias. TDD. AccountService debe permitir persistir cuentas. No compila. Añadimos una nueva propiedad a la clase Account. El identificador. AccountNumber. Aqui incluimos el mock antes de implementar nada. Sabemos que por buena practica el Servicio no irá directo contra Repositorio.
  • 84. Persistiendo los cambios  - Diseñamos el Test con las dependencias en Mente.  - Nos damos cuenta de la necesidad de un identificador de cuenta. Y lo incluimos en nuestro Test.  - Siempre pensar en como queremos invocar a nuestras APIs
  • 85. Lo hacemos compilar. Implementamos en account service. Ejecutamos el test. Barra Verde.
  • 86. Test Driving el DAO. Test de Integración. Ahora haremos la implementación del DAO guiado por tests. Exactamente igual que como hasta ahora. Solo que ahora interactuamos con elemento externo. La Base de Datos, o sistema de ficheros. Pero empecemos por el test.
  • 87. Utilizaremos el poderoso Spring Test Context para las pruebas de integración. (Las siguientes pruebas se hicieron 1 a 1).
  • 88.
  • 89. Implementamos (En realidad lo anterior se hizo test a test. Pero para recortar lo ponemos todo de hecho con la primera ejecución nos dimos cuenta que Account debía ser serializable y debiamos implementar el equals y el hashcode para comparar Accounts) .
  • 90.
  • 91. En algunos casos, los tests de integración son bastante mas lentos que los tests unitarios como vemos. Ejecutamos la suite entera de tests
  • 92. Persistiendo las transferencias El servicio de transferencias ahora mismo no persiste los datos. Debemos añadir esto a nuestra aplicación. Lo añadimos en el Test, lo hacemos compilar, y lo implementamos en el servicio. Con el mismo procedimiento paso a paso hecho hasta ahora. Al final obtenemos el siguiente resultado. Obteniendo la barra verde.
  • 93.
  • 94.
  • 95.
  • 97. TDD el controlador. Se basa en los mismos procedimientos que el probar las otras capas. Centrarnos en la funcionalidad requerida, y simular los demas componentes. Las dependencias. Sabemos que trabajaremos con Controllers de Spring. Lo primero que haremos será la funcionalidad para presentar el formulario.
  • 98.
  • 99. TDD El controlador. Lo hacemos compilar.Ejecutamos. Barra Roja
  • 100.
  • 101. TDD el controlador Implementamos. Ejecutamos el Test. Barra Verde. En principio no hay refactorización que hacer.
  • 102. TDD el controlador. El submit del formulario Mocking HttpServletRequest.
  • 103. TDD el controlador. Implementamos. Barra Verde.
  • 104. Ejecutamos la Suite Entera de Tests. Barra Verde.
  • 105. El test funcional. Creamos las JSPs requeridas segun nuestros Test, nuestro controller y nuestro conocimiento de Spring MVC. Transfer.jsp
  • 107. Todo dentro del Test  El Test funcional idealmente es capaz de iniciar todo su entorno. En nuestro caso iniciamos el Tomcat.
  • 108. Utilizamos Cargo para controlar el servidor.
  • 109. Preparando para el Test Funcional
  • 110. Las 2 fases del BUILD
  • 111. Ejecutando el Test Funcional. Incluimos Un setup Completo en el test que inicia el servidor tomcat.
  • 112. Ejecutamos la Suite Entera  Incluyendo Funcionales
  • 113. Las 2 Fases del BUILD  En un entorno de integración continua.  Mvn test: Ejecuta los Tests unitarios, se ejecutara en cada momento  Mvn integration-test: Ejecuta los Tests funcionales. 2 veces al dia.
  • 114. Revisando el Code Coverage  Cobertura.  Mvn site  Mas que medir la cobertura por porcentaje. Estar conscientes de que hemos probado lo necesario.
  • 115. Reporte del Ejemplo PACKAGE CLASES LINE COVERAGE ALL PACKAGES 16 75% ORG.PT.TDD 1 92% ORG.PT.TDD.DAO 2 75% ORG.PT.TDD.DOMAIN 3 69% ORG.PT.TDD.EXCEPTI ON 3 50% ORG.PT.TDD.FORM 1 100% ORG.PT.TDD.SERVICE 6 90% Cobertura 136/179 15/20 26/28 64/92 6 12 18/20 7/7
  • 118. Conclusiones -- TDD nos ayudan a mantener el foco de lo que queremos desarrollar. -- TDD nos sirve como red de seguridad para atrapar Bugs lo antes posible. -- TDD nos da seguridad de que lo que desarrollamos funciona.