Vous êtes sur la page 1sur 91

Testing con Spring 3

Because 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 Spring


Contenedor 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 prueba
Robert C. Martin (Uncle Bob)

Qu es TDD?

Test Driven Development


Desarrollo 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 negocio


La Lgica de negocio:

Creando la lgica de negocio


Colaboradores Colaboradores La Lgica de negocio:

Creando la lgica de negocio


La Lgica de negocio:
Comportamiento Comportamiento de de Colaboradores Colaboradores

Creando la lgica de negocio


Verificacin V La Lgica de negocio:erificacin

Creando la lgica de negocio


El 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 Spring


Aparecen: @Service @Inject @Inject @Component

Ahora con Spring


He perdido mi flow!!

Ahora con Spring


Es 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

Consejo
No 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 Spring


Entidades

BD Controllers Servicios de negocio


DAOs ORMS: - JPA - Hibernate - Ibatis

Persistencia

Arquitectura con Spring


@Controller @Service @Repository
Entidades

BD Controllers Servicios de negocio


DAOs 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 Real


Podemos conseguir que nuestros test no modifiquen la BD mediante un rollback al finalizar los test:

Test de Integracin: BD Real


Ventajas
- Pruebas similares al entorno final. - Scripts de base de datos son similares al entorno final.

Test de Integracin: BD Real


Desventajas
- Test lentos. - Necesidad de tener la BD instalada.

Test de Integracin: BD En Memoria


Spring 3 permite la creacin de bases de datos en memoria:

Test de Integracin: BD En Memoria


Ventajas
- Test muy rpidos. - No es necesario instalar ninguna base de datos.

Test de Integracin: BD En Memoria


Desventajas
- 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

Vous aimerez peut-être aussi