XPWEEK - Testing con Spring 3

Preview:

DESCRIPTION

Mi charla en la XPWeek sobre como hacer testing con frameworks. Especial atención a Spring 3.0

Citation preview

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:

Recommended