SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
Desarrollo de pruebas en Java EE 
MADRID · NOV 21-22 · 2014 
José Manuel López Doña 
Arquitecto Software en Sopra 
@josemanlopez
MADRID · NOV 21-22 · 2014
¡Espera! ¿Realmente las necesito? 
main() 
MADRID · NOV 21-22 · 2014 
EPIC FAIL!
Si desarrollas pruebas en el código 
PRUEBAS DRY, 
SOLID, ... 
MADRID · NOV 21-22 · 2014
Requisitos previos, conocer bien: 
● Las técnicas de desarrollo / frameworks / 
MADRID · NOV 21-22 · 2014 
librerías que se estén utilizando 
● Metodologías, conceptos y herramientas para 
desarrollar pruebas: TDD/BDD, Mocks, Stubs, 
Spies, Mockito, EasyMocks, etc.
MADRID · NOV 21-22 · 2014 
Si, si… suena bien, pero... 
Lo intenté y Java EE no me lo 
puso fácil 
Java developer
Evolución del desarrollo en Java EE 
MADRID · NOV 21-22 · 2014 
JNDI 
CMP 
EJB2 
Struts 
Hibernate Spring 
JSF 
JPA 
EJB3 
Seam CDI 
Arquillian 
Servicios de 
contenedor 
Modelo 
POJO 
Inyección de 
dependencias 
Integración 
frameworks 
Facilidad en 
el desarrollo 
Facilidad 
para probar 
Fuente: http://www.slideshare.net/nukeevry1/arquillian
Tipos de pruebas (automáticas) 
MADRID · NOV 21-22 · 2014 
● Pruebas unitarias 
● Pruebas de integración 
○ Infraestructura (contenedor / servidor de aplicaciones) 
○ Con otros sistemas/aplicaciones 
● Pruebas funcionales
MADRID · NOV 21-22 · 2014 
Java EE 7 
CDI 
Extensions 
Web 
Fragments 
Servlet 3.1 
JSF 2.2 
JSP 2.3 
EL 3.0 
JAX-WS 2.2 
JAX-RS 2.0 JSON 1.0 WebSocket 
1.0 
CDI 1.1 Interceptors 1.0 
JTA 1.2 
Managed Beans 1.0 
JPA 2.1 JMS 2.0 
Common 
Annotations 1.1 Concurrency 1.0 
EJB 3.2 
JCA 1.7 Batch 1.0 
Bean Validations 1.1 
¿MOCKS PARA TODO?
Arquitectura de pruebas en Java EE 
MADRID · NOV 21-22 · 2014 
Test Case 
Arquillian 
Core + Extensions 
ShrinkWrap 
Unit Testing Framework 
Junit / TestNG 
Coverage 
JaCoCo 
Maven 
Container 
TomEE Embedded 
OpenWebBeans 
Embedded Database 
Derby
MADRID · NOV 21-22 · 2014 
Arquillian: características 
● Pruebas reales Java EE sin necesidad de mocks 
● IDE friendly: ejecución de JUnit (o TestNG) desde el IDE o Maven 
● Test enriquecidos: uso de características Java EE y extensiones 
● Control del classpath: micro-despliegues en las pruebas 
● Depuración de las pruebas desplegadas en servidor 
● Contenedor agnóstico: múltiples adaptadores
Arquillian: configuración proyecto 
● Incluir dependencias en fichero pom.xml 
○ Importar arquillian core, extensiones y runtimes 
○ Crear maven profiles para tener diferentes runtimes 
● Configurar el fichero arquillian.xml para sobrescribir 
MADRID · NOV 21-22 · 2014 
valores por defecto (opcional)
Arquillian: desarrollo de pruebas 
● Crear testcase con JUnit 
● Incluir las clases bajo prueba usando ShrinkWrap 
● Programar los métodos de pruebas @Test 
● Ejecutar la prueba JUnit desde Maven / IDE 
MADRID · NOV 21-22 · 2014
Arquillian: código ejemplo test 
@RunWith(Arquillian.class) 
public class GreeterTest { 
MADRID · NOV 21-22 · 2014 
@Inject 
Greeter greeter; 
@Deployment (name="GreeterTest") 
public static JavaArchive createDeployment() { 
return ShrinkWrap.create(JavaArchive.class) 
.addClass(Greeter.class) 
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
} 
@Test 
public void should_create_greeting() { 
Assert.fail("Not yet implemented"); 
} 
}
Arquillian: ejecución de test (IDE) 
MADRID · NOV 21-22 · 2014
Arquillian: ¿cuantas clases meto? 
.addPackages(true, Filters.exclude(".*Test.*|.*Mock.*"),"com. 
project"); 
MADRID · NOV 21-22 · 2014 
¿Todas? ¿Puedo? 
● Tamaño JAR/WAR de pruebas 
● Delimitar alcance de la pruebas 
● Consideraciones rendimiento (p.e. contexto JPA) 
● Si se usa embedded solo incluir clases aplicación
Arquillian: adaptadores runtimes 
MADRID · NOV 21-22 · 2014 
● Diferentes tipos: 
○ Contenedor CDI (Weld, OpenWebBeans) 
○ Contenedor EJB (OpenEJB 3.1) 
○ Servidor de aplicaciones (Glassfish, JBoss, WAS, WebLogic, 
TomEE, etc.) 
● Diferentes formas de ejecución 
○ Embedded 
○ Managed 
○ Remote
Arquillian: adaptadores runtimes 
Runtime Tiempo total (seg.) Tiempo test (seg.) 
glassfish-embedded 3.1.2.2 25 1,3 
openwebbeans-embedded 1.1.6 5,8 0,03 
jbossas-managed 7.1.1 20,4 0,3 
wlp-managed 8.5.1.1 31,9 2,3 
tomee-embedded 1.6.0 10,5 0,25 
Resultados de ejecutar 10 veces una prueba de una inyección 
de un EJB con @Inject. 
MADRID · NOV 21-22 · 2014
Arquillian modos de ejecución 
MADRID · NOV 21-22 · 2014 
● Servidor 
● Cliente (@RunAsClient). 
○ Ejemplo: WS REST (Arquillian REST Extension) 
○ Ambos modos son posibles a la vez
Context and Dependency Injection 
MADRID · NOV 21-22 · 2014 
● @Inject 
● @Produce 
● @Alternative, @Specializes
Creación de alternativas (deploy) 
@Alternative 
@Specializes 
@Stereotype 
@Retention(RUNTIME) 
@Target(TYPE) 
public @interface Mock {} 
<beans> 
MADRID · NOV 21-22 · 2014 
<alternatives> 
<stereotype>org.mycompany.testing.Mock</stereotype> 
</alternatives> 
</beans> 
@Mock 
public class MockLoginService extends LoginService { ... 
}
Producción de alternativas (runtime) 
MADRID · NOV 21-22 · 2014 
@Mock @Produces 
LoginService produceMockLoginService() { 
LoginService login = mock(LoginService.class); 
Mockito.when(login.validate(“user1”, “pass_invalid”) 
.thenReturn(RESULT.FAIL); 
Mockito.when(login.validate(“user1”, “pass_valid”) 
.thenReturn(RESULT.SUCCESS); 
return login; 
}
Algunos ejemplos de mocks 
● FacesContext ➜ valores en la request/session 
● Servicios Web (JAX-WS / JAX-RS) 
○ Unmarshal (XML/JSON ➜ POJO) con JAXB/Jackson 
public static <T> getObjectFromXML(String xmlPath, 
Class<T> className) 
MADRID · NOV 21-22 · 2014
Arquillian Persistence Extension 
MADRID · NOV 21-22 · 2014 
● Gestión de transacciones 
● Inserción de datos en base de datos 
● Valida datos tras la prueba 
● Se basa en DBUnit
Arquillian Persistence Extension 
expected-users.yml 
MADRID · NOV 21-22 · 2014 
users.yml 
useraccount: 
- id: 1 
firstname: John 
lastname: Smith 
username: doovde 
password: password 
- id: 2 
firstname: Clark 
lastname: Kent 
username: superman 
password: kryptonite 
useraccount: 
- firstname: John 
lastname: Smith 
username: doovde 
password: password 
- firstname: Clark 
lastname: Kent 
username: superman 
password: LexLuthor
Arquillian Persistence Extension 
@Test 
@UsingDataSet("datasets/users.yml") 
@ShouldMatchDataSet("datasets/expected-users.yml") 
public void should_change_user_password() throws Exception 
{ 
// given 
String expectedPassword = "LexLuthor"; 
UserAccount user = em.find(UserAccount.class, 2L); 
// when 
user.setPassword(expectedPassword); 
user = em.merge(user); 
// then 
assertEquals(expectedPassword, user.getPassword()); 
MADRID · NOV 21-22 · 2014 
}
Estrategias de pruebas: End-to-End 
MADRID · NOV 21-22 · 2014 
Backing Bean 
JPA 
EJB 
Arquillian 
Persistence Derby 
Port Mock 
JAX-WS 
Prueba 
Arquillian
Estrategias de pruebas: Aisladas 
Arquillian 
Persistence Derby 
JPA Mock EJB Mock 
Backing Bean EJB JPA 
MADRID · NOV 21-22 · 2014 
Port Mock 
JAX-WS 
Prueba 
Arquillian 
Prueba 
Arquillian 
Prueba 
Arquillian
MADRID · NOV 21-22 · 2014 
Cobertura: JaCoCo
MADRID · NOV 21-22 · 2014 
Cobertura: JaCoCo
MADRID · NOV 21-22 · 2014 
Cobertura: Sonar
Principales problemas encontrados 
● Falta documentación de configuraciones avanzadas 
● Diferentes versiones de Arquillian y extensions 
● Diferente comportamiento según contenedores 
MADRID · NOV 21-22 · 2014
Algunas lecciones aprendidas 
● Utilizar pruebas aisladas para TDD 
● Uso de plugin failsafe para pruebas end-to-end 
● Uso de @Inject en vez de @EJB 
● Probar bien la arquitectura base de pruebas 
● Elaborar una metodología de uso para desarrolladores 
● Integración continua: ¡Rompe el build! }:-) 
MADRID · NOV 21-22 · 2014
MADRID · NOV 21-22 · 2014 
FIN 
@josemanlopez 
https://www.linkedin.com/in/josemanlopez 
http://josemlopez.blogspot.com.es/ 
http://goo.gl/MOi8zb

Weitere ähnliche Inhalte

Was ist angesagt?

Mejores a nuestros proyectos de Software
Mejores a nuestros proyectos de SoftwareMejores a nuestros proyectos de Software
Mejores a nuestros proyectos de SoftwareJose Luis Bugarin Peche
 
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!Iván López Martín
 
Microservicios sobre tecnologías Pivotal y VMware
Microservicios sobre tecnologías Pivotal y VMwareMicroservicios sobre tecnologías Pivotal y VMware
Microservicios sobre tecnologías Pivotal y VMwareAntonio Gallego
 
Herramientas Ágiles para Desarrollo
Herramientas Ágiles para DesarrolloHerramientas Ágiles para Desarrollo
Herramientas Ágiles para DesarrolloGastón Guillerón
 
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...Eudris Cabrera
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 Micael Gallego
 
Mecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microserviciosMecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microserviciosSoftware Guru
 
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!Iván López Martín
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18Young Suk Ahn Park
 

Was ist angesagt? (12)

Mejores a nuestros proyectos de Software
Mejores a nuestros proyectos de SoftwareMejores a nuestros proyectos de Software
Mejores a nuestros proyectos de Software
 
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
Madrid-GUG (Alicante) 2017 - De Java a Groovy: ¡Hora de Aventuras!
 
Microservicios sobre tecnologías Pivotal y VMware
Microservicios sobre tecnologías Pivotal y VMwareMicroservicios sobre tecnologías Pivotal y VMware
Microservicios sobre tecnologías Pivotal y VMware
 
Herramientas Ágiles para Desarrollo
Herramientas Ágiles para DesarrolloHerramientas Ágiles para Desarrollo
Herramientas Ágiles para Desarrollo
 
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...Html5, Rest, JSON, Angular JS y Java EE 7  - Aplicaciones Web Modernas y Esca...
Html5, Rest, JSON, Angular JS y Java EE 7 - Aplicaciones Web Modernas y Esca...
 
SEMINARIO: ACCESO A BASE DE DATOS CON JDBC
SEMINARIO: ACCESO A BASE DE DATOS CON JDBCSEMINARIO: ACCESO A BASE DE DATOS CON JDBC
SEMINARIO: ACCESO A BASE DE DATOS CON JDBC
 
OpenVidu Commitconf 2018
OpenVidu Commitconf 2018 OpenVidu Commitconf 2018
OpenVidu Commitconf 2018
 
Jenkins pipeline
Jenkins pipelineJenkins pipeline
Jenkins pipeline
 
Mecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microserviciosMecanismos y patrones para acelerar adopción en arquitecturas de microservicios
Mecanismos y patrones para acelerar adopción en arquitecturas de microservicios
 
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
Codemotion Madrid 2016 - De Java a Groovy: ¡Hora de Aventuras!
 
GWT
GWTGWT
GWT
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18
 

Ähnlich wie Desarrollo de pruebas en entornos Java EE

ASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformEduard Tomàs
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Java 9, 10, 11 ,12, 13 and more
Java 9, 10, 11 ,12, 13 and moreJava 9, 10, 11 ,12, 13 and more
Java 9, 10, 11 ,12, 13 and moreHillmerC
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015José Manuel García García
 
Node para Javeros: Conoce a tu enemigo
Node para Javeros: Conoce a tu enemigoNode para Javeros: Conoce a tu enemigo
Node para Javeros: Conoce a tu enemigoMicael Gallego
 
Tech Meetup: How to solve 2 common problems in Android & iOS
Tech Meetup: How to solve 2 common problems in Android & iOSTech Meetup: How to solve 2 common problems in Android & iOS
Tech Meetup: How to solve 2 common problems in Android & iOSSantex Group
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesEnrique Catala Bañuls
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmockkaolong
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterAdolfo Sanz De Diego
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubGlobalLogic Latinoamérica
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesJobsket
 
Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013dayaorte
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Fernando Petrola
 

Ähnlich wie Desarrollo de pruebas en entornos Java EE (20)

ASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platform
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Codemotion 2014 Scala @real life
Codemotion 2014 Scala @real lifeCodemotion 2014 Scala @real life
Codemotion 2014 Scala @real life
 
Scala @ Real Life Codemotion 2014
Scala @ Real Life Codemotion 2014Scala @ Real Life Codemotion 2014
Scala @ Real Life Codemotion 2014
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Java 9, 10, 11 ,12, 13 and more
Java 9, 10, 11 ,12, 13 and moreJava 9, 10, 11 ,12, 13 and more
Java 9, 10, 11 ,12, 13 and more
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
 
10 cosas de rails que deberías saber
10 cosas de rails que deberías saber10 cosas de rails que deberías saber
10 cosas de rails que deberías saber
 
Test unitarios
Test unitariosTest unitarios
Test unitarios
 
Node para Javeros: Conoce a tu enemigo
Node para Javeros: Conoce a tu enemigoNode para Javeros: Conoce a tu enemigo
Node para Javeros: Conoce a tu enemigo
 
Tech Meetup: How to solve 2 common problems in Android & iOS
Tech Meetup: How to solve 2 common problems in Android & iOSTech Meetup: How to solve 2 common problems in Android & iOS
Tech Meetup: How to solve 2 common problems in Android & iOS
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdades
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmock
 
Webpack desde cero
Webpack desde ceroWebpack desde cero
Webpack desde cero
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Del infierno al cielo
Del infierno al cieloDel infierno al cielo
Del infierno al cielo
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 

Desarrollo de pruebas en entornos Java EE

  • 1. Desarrollo de pruebas en Java EE MADRID · NOV 21-22 · 2014 José Manuel López Doña Arquitecto Software en Sopra @josemanlopez
  • 2. MADRID · NOV 21-22 · 2014
  • 3. ¡Espera! ¿Realmente las necesito? main() MADRID · NOV 21-22 · 2014 EPIC FAIL!
  • 4. Si desarrollas pruebas en el código PRUEBAS DRY, SOLID, ... MADRID · NOV 21-22 · 2014
  • 5. Requisitos previos, conocer bien: ● Las técnicas de desarrollo / frameworks / MADRID · NOV 21-22 · 2014 librerías que se estén utilizando ● Metodologías, conceptos y herramientas para desarrollar pruebas: TDD/BDD, Mocks, Stubs, Spies, Mockito, EasyMocks, etc.
  • 6. MADRID · NOV 21-22 · 2014 Si, si… suena bien, pero... Lo intenté y Java EE no me lo puso fácil Java developer
  • 7. Evolución del desarrollo en Java EE MADRID · NOV 21-22 · 2014 JNDI CMP EJB2 Struts Hibernate Spring JSF JPA EJB3 Seam CDI Arquillian Servicios de contenedor Modelo POJO Inyección de dependencias Integración frameworks Facilidad en el desarrollo Facilidad para probar Fuente: http://www.slideshare.net/nukeevry1/arquillian
  • 8. Tipos de pruebas (automáticas) MADRID · NOV 21-22 · 2014 ● Pruebas unitarias ● Pruebas de integración ○ Infraestructura (contenedor / servidor de aplicaciones) ○ Con otros sistemas/aplicaciones ● Pruebas funcionales
  • 9. MADRID · NOV 21-22 · 2014 Java EE 7 CDI Extensions Web Fragments Servlet 3.1 JSF 2.2 JSP 2.3 EL 3.0 JAX-WS 2.2 JAX-RS 2.0 JSON 1.0 WebSocket 1.0 CDI 1.1 Interceptors 1.0 JTA 1.2 Managed Beans 1.0 JPA 2.1 JMS 2.0 Common Annotations 1.1 Concurrency 1.0 EJB 3.2 JCA 1.7 Batch 1.0 Bean Validations 1.1 ¿MOCKS PARA TODO?
  • 10. Arquitectura de pruebas en Java EE MADRID · NOV 21-22 · 2014 Test Case Arquillian Core + Extensions ShrinkWrap Unit Testing Framework Junit / TestNG Coverage JaCoCo Maven Container TomEE Embedded OpenWebBeans Embedded Database Derby
  • 11. MADRID · NOV 21-22 · 2014 Arquillian: características ● Pruebas reales Java EE sin necesidad de mocks ● IDE friendly: ejecución de JUnit (o TestNG) desde el IDE o Maven ● Test enriquecidos: uso de características Java EE y extensiones ● Control del classpath: micro-despliegues en las pruebas ● Depuración de las pruebas desplegadas en servidor ● Contenedor agnóstico: múltiples adaptadores
  • 12. Arquillian: configuración proyecto ● Incluir dependencias en fichero pom.xml ○ Importar arquillian core, extensiones y runtimes ○ Crear maven profiles para tener diferentes runtimes ● Configurar el fichero arquillian.xml para sobrescribir MADRID · NOV 21-22 · 2014 valores por defecto (opcional)
  • 13. Arquillian: desarrollo de pruebas ● Crear testcase con JUnit ● Incluir las clases bajo prueba usando ShrinkWrap ● Programar los métodos de pruebas @Test ● Ejecutar la prueba JUnit desde Maven / IDE MADRID · NOV 21-22 · 2014
  • 14. Arquillian: código ejemplo test @RunWith(Arquillian.class) public class GreeterTest { MADRID · NOV 21-22 · 2014 @Inject Greeter greeter; @Deployment (name="GreeterTest") public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(Greeter.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Test public void should_create_greeting() { Assert.fail("Not yet implemented"); } }
  • 15. Arquillian: ejecución de test (IDE) MADRID · NOV 21-22 · 2014
  • 16. Arquillian: ¿cuantas clases meto? .addPackages(true, Filters.exclude(".*Test.*|.*Mock.*"),"com. project"); MADRID · NOV 21-22 · 2014 ¿Todas? ¿Puedo? ● Tamaño JAR/WAR de pruebas ● Delimitar alcance de la pruebas ● Consideraciones rendimiento (p.e. contexto JPA) ● Si se usa embedded solo incluir clases aplicación
  • 17. Arquillian: adaptadores runtimes MADRID · NOV 21-22 · 2014 ● Diferentes tipos: ○ Contenedor CDI (Weld, OpenWebBeans) ○ Contenedor EJB (OpenEJB 3.1) ○ Servidor de aplicaciones (Glassfish, JBoss, WAS, WebLogic, TomEE, etc.) ● Diferentes formas de ejecución ○ Embedded ○ Managed ○ Remote
  • 18. Arquillian: adaptadores runtimes Runtime Tiempo total (seg.) Tiempo test (seg.) glassfish-embedded 3.1.2.2 25 1,3 openwebbeans-embedded 1.1.6 5,8 0,03 jbossas-managed 7.1.1 20,4 0,3 wlp-managed 8.5.1.1 31,9 2,3 tomee-embedded 1.6.0 10,5 0,25 Resultados de ejecutar 10 veces una prueba de una inyección de un EJB con @Inject. MADRID · NOV 21-22 · 2014
  • 19. Arquillian modos de ejecución MADRID · NOV 21-22 · 2014 ● Servidor ● Cliente (@RunAsClient). ○ Ejemplo: WS REST (Arquillian REST Extension) ○ Ambos modos son posibles a la vez
  • 20. Context and Dependency Injection MADRID · NOV 21-22 · 2014 ● @Inject ● @Produce ● @Alternative, @Specializes
  • 21. Creación de alternativas (deploy) @Alternative @Specializes @Stereotype @Retention(RUNTIME) @Target(TYPE) public @interface Mock {} <beans> MADRID · NOV 21-22 · 2014 <alternatives> <stereotype>org.mycompany.testing.Mock</stereotype> </alternatives> </beans> @Mock public class MockLoginService extends LoginService { ... }
  • 22. Producción de alternativas (runtime) MADRID · NOV 21-22 · 2014 @Mock @Produces LoginService produceMockLoginService() { LoginService login = mock(LoginService.class); Mockito.when(login.validate(“user1”, “pass_invalid”) .thenReturn(RESULT.FAIL); Mockito.when(login.validate(“user1”, “pass_valid”) .thenReturn(RESULT.SUCCESS); return login; }
  • 23. Algunos ejemplos de mocks ● FacesContext ➜ valores en la request/session ● Servicios Web (JAX-WS / JAX-RS) ○ Unmarshal (XML/JSON ➜ POJO) con JAXB/Jackson public static <T> getObjectFromXML(String xmlPath, Class<T> className) MADRID · NOV 21-22 · 2014
  • 24. Arquillian Persistence Extension MADRID · NOV 21-22 · 2014 ● Gestión de transacciones ● Inserción de datos en base de datos ● Valida datos tras la prueba ● Se basa en DBUnit
  • 25. Arquillian Persistence Extension expected-users.yml MADRID · NOV 21-22 · 2014 users.yml useraccount: - id: 1 firstname: John lastname: Smith username: doovde password: password - id: 2 firstname: Clark lastname: Kent username: superman password: kryptonite useraccount: - firstname: John lastname: Smith username: doovde password: password - firstname: Clark lastname: Kent username: superman password: LexLuthor
  • 26. Arquillian Persistence Extension @Test @UsingDataSet("datasets/users.yml") @ShouldMatchDataSet("datasets/expected-users.yml") public void should_change_user_password() throws Exception { // given String expectedPassword = "LexLuthor"; UserAccount user = em.find(UserAccount.class, 2L); // when user.setPassword(expectedPassword); user = em.merge(user); // then assertEquals(expectedPassword, user.getPassword()); MADRID · NOV 21-22 · 2014 }
  • 27. Estrategias de pruebas: End-to-End MADRID · NOV 21-22 · 2014 Backing Bean JPA EJB Arquillian Persistence Derby Port Mock JAX-WS Prueba Arquillian
  • 28. Estrategias de pruebas: Aisladas Arquillian Persistence Derby JPA Mock EJB Mock Backing Bean EJB JPA MADRID · NOV 21-22 · 2014 Port Mock JAX-WS Prueba Arquillian Prueba Arquillian Prueba Arquillian
  • 29. MADRID · NOV 21-22 · 2014 Cobertura: JaCoCo
  • 30. MADRID · NOV 21-22 · 2014 Cobertura: JaCoCo
  • 31. MADRID · NOV 21-22 · 2014 Cobertura: Sonar
  • 32. Principales problemas encontrados ● Falta documentación de configuraciones avanzadas ● Diferentes versiones de Arquillian y extensions ● Diferente comportamiento según contenedores MADRID · NOV 21-22 · 2014
  • 33. Algunas lecciones aprendidas ● Utilizar pruebas aisladas para TDD ● Uso de plugin failsafe para pruebas end-to-end ● Uso de @Inject en vez de @EJB ● Probar bien la arquitectura base de pruebas ● Elaborar una metodología de uso para desarrolladores ● Integración continua: ¡Rompe el build! }:-) MADRID · NOV 21-22 · 2014
  • 34. MADRID · NOV 21-22 · 2014 FIN @josemanlopez https://www.linkedin.com/in/josemanlopez http://josemlopez.blogspot.com.es/ http://goo.gl/MOi8zb

Hinweis der Redaktion

  1. Misma vs diferente JVM de ejecución TDD vs Entorno real Profiles Maven Filtros en plugin surfire / failsafe de Maven