Testing Con Spring3

download Testing Con Spring3

of 91

Transcript of Testing Con Spring3

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