testing con spring3
TRANSCRIPT
Testing con Spring 3Because seeds grow in the
Soy Israel Alczar@ialcazar farmerdev.com
Aprendiz de todo, maestro de nada. Me gusta trabajar con mquinas: - Developer Me gusta trabajar con personas: - Scrum Master - Mentor, Coach y Trainer
Empecemos.... Con Pasin!!!
Empecemos por el principio
Para qu sirve SpringContenedor ligero de objetos planos (POJO) Permite inversin de control e inyeccin de dependencias. Factora de objetos. Integracin con las APIs Java mas importantes.
Por qu testing con Spring?Es Java. Framework mas utilizado en el desarrollo de aplicaciones JEE. Permite POJOs Orientado a pruebas Integracin con casi cualquier tecnologa.
Un poco de historia
2004: Spring 1.0 2006: Spring 2.0 2007: Spring 2.5 2010: Spring 3.0 2011: Spring 3.1
Arquitectura
Arquitectura
Arquitectura
TESTING TESTING
Qu tipos de test puedo realizar?
Test Unitarios Test de Integracin
Qu tipos de test puedo realizar?Ests seguro joven Padawan?
Test Unitarios Test de Integracin
Robert C. Martin (Uncle Bob)
Qu tipos de test puedo realizar?Un test unitario debe ser: Rpido Independiente del entorno Repetible en el tiempo Validarse por si mismo Con TDD test siempre antes que el cdigo que pruebaRobert C. Martin (Uncle Bob)
Qu es TDD?
Test Driven DevelopmentDesarrollo Digido por Pruebas
Qu es TDD?Me gusta ms que se le llame: Diseo Dirigido por Ejemplos (Examples Driven Design)
Los pasos de TDD:
Los pasos de TDD:
Los pasos de TDD:
Estructura de una aplicacin con Spring
Estructura de una aplicacin
Persistencia Persistencia
Vista
Controllers
Lgica Negocio
Sistemas Perifricos
BD
Estructura de una aplicacin
Persistencia Persistencia
Vista
Controllers
Lgica Negocio
Sistemas Perifricos
BD
Dos mundos!!
Estructura de una aplicacin
Persistencia Persistencia
Vista
Controllers
Lgica Negocio
Sistemas Perifricos
BD
Tres mundos!!
Por dnde empiezo?
Cogiendo flow...
Funcionalidad Controller
De fuera hacia dentro...
Cogiendo flow...
Funcionalidad Controller
Tests Unitarios
Cogiendo flow...
Funcionalidad Controller
Los colaboradores del controller son dobles ya que no tenemos a los objetos originales
Cogiendo flow...
Funcionalidad Controller
Permite centrarse en la colaboracin entre objetos
Cogiendo flow...
Funcionalidad Controller
Utilizamos...
Cogiendo flow...
Funcionalidad Controller
Utilizamos...
Cogiendo flow...La inicializacin:
Cogiendo flow...La inicializacin:
Inyeccin del Inyeccin del colaborador colaborador
Cogiendo flow...El mtodo de test:
Cogiendo flow...El mtodo de test:
Comportamiento Comportamiento de de los dobles los dobles
Cogiendo flow...El mtodo de test:
Lo que estamos Lo que estamos probando probando
Cogiendo flow...El mtodo de test:
Verificacin del Verificacin del comportamiento comportamiento
Cogiendo flow...El controller: Es una clase plana
Y ahora qu?
Creando la lgica de negocio
Funcionalidad Controller Lgica de Negocio
Tests Unitarios
Creando la lgica de negocioLa Lgica de negocio:
Creando la lgica de negocioColaboradores Colaboradores La Lgica de negocio:
Creando la lgica de negocioLa Lgica de negocio:Comportamiento Comportamiento de de Colaboradores Colaboradores
Creando la lgica de negocioVerificacin V La Lgica de negocio:erificacin
Creando la lgica de negocioEl cdigo El cdigo resultante resultante
Dnde est Spring?
Ten en cuenta
Spring no aparece en los test unitarios
Ten en cuenta
Spring no aparece en los test unitarios Disea tus clases sin pensar en frameworks
Ten en cuenta
Spring no aparece en los test unitarios Disea tus clases sin pensar en frameworks Usa TDD como herramienta de diseo.
Ya tenemos los test unitarios. Qu hago?
Test de Integracin
Persistencia Persistencia
Vista
Controllers
Lgica Negocio
Sistemas Perifricos
BD
Unamos todas las piezas
Test de Integracin
Persistencia Persistencia
Controllers
Lgica Negocio
Sistemas Perifricos
BD
Unamos todas las piezas
Ahora con Spring
Es el momento de utilizar Spring como pegamento
Ahora con Spring
Un ejemplo prctico
Ahora con SpringAparecen: @Service @Inject @Inject @Component
Ahora con SpringHe perdido mi flow!!
Ahora con SpringEs fcil caer en la anarqua y el caos en los test de integracin!! @Service @Repository
@Inject
@Component
Recuerda el poder Recuerda el poder del TDD del TDD
Kent Beck
ConsejoNo abandones el TDD en los test de integracin, deja que estos te guen...
Qu pasa con Qu pasa con los baby steps? los baby steps?
Jos Manuel Beas
http://blog.jmbeas.es/2011/07/25/pasito-a-pasito/
Con TDD en integracin- Demasiado tiempo hasta llegar a luces verdes - No baby steps but at least safe steps. - No caigas en la anarqua, que te guien los test.
Arquitecturas que emergen con Spring
Arquitectura con SpringEntidades
BD Controllers Servicios de negocioDAOs ORMS: - JPA - Hibernate - Ibatis
Persistencia
Arquitectura con Spring@Controller @Service @RepositoryEntidades
BD Controllers Servicios de negocioDAOs ORMS: - JPA - Hibernate - Ibatis
Aadidas Anotaciones
Persistencia
Cuidado con los Cuidado con los Modelos anmicos!! Modelos anmicos!!
Martin Fowler
http://martinfowler.com/bliki/AnemicDomainModel.html
Estamos utilizando Estamos utilizando la orientacin a la orientacin a objetos? objetos?
Martin Fowler
Estamos haciendo JABOL!! Programamos en JAva como si fuera coBOL
Estamos haciendo JABOL!! Programamos en JAva como si fuera coBOL Estructuras de datos + procedimientos
Arquitectura con Spring- Las propias anotaciones de Spring nos guan al JABOL.(@Service) - Algunas anotaciones inducen a la confusin (@Repository)
A tener en cuenta- Es posible hacer P.O.O con Spring.
A tener en cuenta- Es posible hacer P.O.O con Spring. - Es fcil caer en las tentaciones de los frameworks.
A tener en cuenta- Es posible hacer P.O.O con Spring. - Es fcil caer en las tentaciones de los frameworks. - Es posible hacer DDD (Domain Driven Design) con Spring
Probando la persistencia
Opciones
- Test Unitarios Simular el API de BD - Test Integracin Contra una base de datos
Test Unitarios- Simulacin API de BD (JDBC)
Test Unitarios- Simulacin API de BD (JDBC) + Mocks de PreparedStatement, etc
Test Unitarios- Simulacin API de BD (JDBC) + Mocks de PreparedStatement, etc
PreparedStatement statement = mock(PreparedStatement.class) when(statement.exequteQuery(query)).thenReturn(mock(ResultSet.class))
Test Unitarios- Simulacin API de BD (JDBC) - DBUnit (dbunit.org)
Realmente son pruebas unitarias??
Test de Integracin- Base de datos real + Commit + Rollback de los test - Base de datos en memoria
Test de Integracin: BD Real- Spring permite la creacin de conexiones directas con BD sin Pool de conexiones. - Spring 3 permite aadir scripts SQL directamente.
Test de Integracin: BD Real
Test de Integracin: BD RealPodemos conseguir que nuestros test no modifiquen la BD mediante un rollback al finalizar los test:
Test de Integracin: BD RealVentajas- Pruebas similares al entorno final. - Scripts de base de datos son similares al entorno final.
Test de Integracin: BD RealDesventajas- Test lentos. - Necesidad de tener la BD instalada.
Test de Integracin: BD En MemoriaSpring 3 permite la creacin de bases de datos en memoria:
Test de Integracin: BD En MemoriaVentajas- Test muy rpidos. - No es necesario instalar ninguna base de datos.
Test de Integracin: BD En MemoriaDesventajas- No es la base de datos real. - Lenguaje SQL propio de la base de datos embebida.
Test de Integracin Cul utilizar?
La intencin es lo La intencin es lo que cuenta!! que cuenta!!
Enrique Amodeo Rubio
Todo depende de lo Todo depende de lo que quieras probar que quieras probar
Enrique Amodeo Rubio
Conclusiones- Utiliza lo que necesites en cada momento. - No supedites tu arquitectura a un framework. - No seas talibn, todo es bueno y malo a la vez.
Preguntas
Podis encontrarme en: @ialcazar farmerdev.com