xpweek - testing con spring 3
DESCRIPTION
Mi charla en la XPWeek sobre como hacer testing con frameworks. Especial atención a Spring 3.0TRANSCRIPT
Testing con Spring 3
Because seeds grow in the
Soy Israel AlcázarAprendiz de todo, maestro de nada.
Me gusta trabajar con máquinas:- Developer
Me gusta trabajar con personas:- Scrum Master- Mentor, Coach y Trainer
@ialcazar
farmerdev.com
Empecemos....
¡¡¡Con Pasión!!!
Empecemos por el principio
Para qué sirve Spring
Contenedor ligero de objetos planos (POJO)
Permite inversión de control e inyección de dependencias.
Factoría de objetos.
Integración 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
Integración con casi cualquier tecnología.
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
¿Qué tipos de test puedo realizar?
Test Unitarios
Test de Integración
¿Qué tipos de test puedo realizar?
Test Unitarios
Test de Integración
¿Estás seguro joven Padawan?
Robert C. Martin (Uncle Bob)
¿Qué tipos de test puedo realizar?
Un test unitario debe ser:
Rápido Independiente del entorno Repetible en el tiempo
Validarse por si mismo
Con TDD siempre antes del código. Robert C. Martin (Uncle Bob)
¿Qué es TDD?
Test Driven Development
Desarrollo Digido por Pruebas
¿Qué es TDD?
Diseño Dirigido por Ejemplos
(Examples Driven Design)
Los pasos de TDD:
Los pasos de TDD:
Los pasos de TDD:
Estructura de una aplicación con Spring
Estructura de una aplicación
PersistenciaPersistencia
Vista Controllers Lógica Negocio
Sistemas Periféricos
BD
Estructura de una aplicación
PersistenciaPersistencia
Vista Controllers Lógica Negocio
Sistemas Periféricos
BD
¡¡Dos mundos!!
Estructura de una aplicación
PersistenciaPersistencia
Vista Controllers Lógica Negocio
Sistemas Periféricos
BD
¡¡Tres mundos!!
¿Por dónde empiezo?
Cogiendo flow...
FuncionalidadController
De fuera hacia dentro...
Cogiendo flow...
FuncionalidadController
Tests Unitarios
Cogiendo flow...
FuncionalidadController
Colaboradores son dobles
Cogiendo flow...
FuncionalidadController
Permite centrarse en la colaboración entre objetos
Cogiendo flow...
FuncionalidadController
Utilizamos...
Cogiendo flow...
FuncionalidadController
Utilizamos...
Cogiendo flow...
La inicialización:
Cogiendo flow...
La inicialización:
Inyección del colaborador
Inyección del colaborador
Cogiendo flow...
El método de test:
Cogiendo flow...
El método de test:
Comportamiento de
los dobles
Comportamiento de
los dobles
Cogiendo flow...
El método de test:
Lo que estamosprobando
Lo que estamosprobando
Cogiendo flow...
El método de test:
Verificación del comportamientoVerificación del comportamiento
Cogiendo flow...
El controller: Es una clase plana
¿Y ahora qué?
Creando la lógica de negocio
FuncionalidadController
Tests Unitarios
Lógica de Negocio
Creando la lógica de negocio
La Lógica de negocio:
Creando la lógica de negocio
La Lógica de negocio:ColaboradoresColaboradores
Creando la lógica de negocio
La Lógica de negocio:Comportamiento
de Colaboradores
Comportamiento de
Colaboradores
Creando la lógica de negocio
La Lógica de negocio:VerificaciónVerificación
El código resultanteEl código resultante
Creando la lógica de negocio
¿Dónde está Spring?
Ten en cuenta
Spring no aparece en los test unitarios
Ten en cuenta
Spring no aparece en los test unitarios
Diseña tus clases sin pensar en frameworks
Ten en cuenta
Spring no aparece en los test unitarios
Diseña tus clases sin pensar en frameworks
TDD como herramienta de diseño.
Ya tenemos los test unitarios.
¿Qué hago?
Test de Integración
PersistenciaPersistencia
Vista Controllers Lógica Negocio
Sistemas Periféricos
BD
Unamos todas las piezas
Test de Integración
PersistenciaPersistencia
Controllers Lógica Negocio
Sistemas Periféricos
BD
Unamos todas las piezas
Ahora con Spring
Es el momento de utilizar Spring como pegamento
Ahora con Spring
Un ejemplo
Ahora con Spring
Aparecen:
@Service
@Component@Inject
@Inject
Ahora con Spring
¡¡He perdido mi flow!!
Ahora con Spring
¡¡Es fácil caer en la anarquía y el caos en los test de integración!!
@Service
@Component
@Inject@Repository
Recuerda el poder del TDD
Recuerda el poder del TDD
Kent Beck
Consejo
No abandones el TDD en los test de integración, deja que estos te guíen...
¿Qué pasa con los baby steps?¿Qué pasa con los baby steps?
José Manuel Beas
http://blog.jmbeas.es/2011/07/25/pasito-a-pasito/
Con TDD en integración
- Demasiado tiempo hasta llegar a “luces verdes”
- No baby steps but at least safe steps.
- No caigas en la anarquía, que te guien los test.
Arquitecturas que emergen con Spring
Arquitectura con Spring
Controllers Servicios de negocio
Persistencia
BDORMS:- JPA- Hibernate- Ibatis
Entidades
DAOs
Arquitectura con Spring
Controllers Servicios de negocio
Persistencia
BDORMS:- JPA- Hibernate- Ibatis
Entidades
DAOs
@Service@Controller @Repository
Añadidas Anotaciones
¡¡Cuidado con losModelos anémicos!!¡¡Cuidado con los
Modelos anémicos!!
Martin Fowler
http://martinfowler.com/bliki/AnemicDomainModel.html
¿Estamos utilizandola orientación a
objetos?
¿Estamos utilizandola orientación a
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 guían al JABOL.(@Service)
- Algunas anotaciones inducen a la confusión (@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 fácil caer en las tentaciones de los frameworks.
A tener en cuenta
- Es posible hacer P.O.O con Spring.
- Es fácil 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 Integración → Contra una base de datos
Test Unitarios
- Simulación API de BD (JDBC)
Test Unitarios
- Simulación API de BD (JDBC)
+ Mocks de PreparedStatement, etc
Test Unitarios
- Simulación API de BD (JDBC)
+ Mocks de PreparedStatement, etc
PreparedStatement statement = mock(PreparedStatement.class)
when(statement.exequteQuery(query)).thenReturn(mock(ResultSet.class))
Test Unitarios
- Simulación API de BD (JDBC)
- DBUnit (dbunit.org)
¿¿Realmente son pruebas unitarias??
Test de Integración
- Base de datos real+ Commit + Rollback de los test
- Base de datos en memoria
Test de Integración: BD Real
- Spring permite la creación de conexiones directas con BD sin Pool de conexiones.
- Spring 3 permite añadir scripts SQL directamente.
Test de Integración: BD Real
Test de Integración: BD Real
Podemos conseguir que nuestros test no modifiquen la BD mediante un rollback al finalizar los test:
Test de Integración: BD Real
Ventajas
- Pruebas similares al entorno final.
- Scripts de base de datos son similares al entorno final.
Test de Integración: BD Real
Desventajas
- Test lentos.
- Necesidad de tener la BD instalada.
Test de Integración: BD En Memoria
Spring 3 permite la creación de bases de datos en memoria:
Test de Integración: BD En Memoria
Ventajas
- Test muy rápidos.
- No es necesario instalar ninguna base de datos.
Test de Integración: BD Real
Desventajas
- No es la base de datos real.
- Scripts de base de datos diferentes.
Test de Integración
¿Cuál utilizar?
¡¡La intención es loque cuenta!!
¡¡La intención es loque cuenta!!
Enrique Amodeo Rubio
Todo depende de loque quieras probar
Todo depende de loque quieras probar
Enrique Amodeo Rubio
Conclusiones
- Utiliza lo que necesites en cada momento.
- No supedites tu arquitectura a un framework.
- No seas talibán, todo es bueno y malo a la vez.
Preguntas
@ialcazar
farmerdev.com
Podéis encontrarme en: