Desarrollo de pruebas en entornos Java EE

  • Published on
    08-Jul-2015

  • View
    1.856

  • Download
    6

DESCRIPTION

Con el uso de CDI, para la inyeccin de dependencias, y la consolidacin de la plataforma Arquillian, ya no hay excusas en la plataforma Java EE para el desarrollo de pruebas.

Transcript

  • 1. Desarrollo de pruebas en Java EEMADRID NOV 21-22 2014Jos Manuel Lpez DoaArquitecto Software en Sopra@josemanlopez

2. MADRID NOV 21-22 2014 3. Espera! Realmente las necesito?main()MADRID NOV 21-22 2014EPIC FAIL! 4. Si desarrollas pruebas en el cdigoPRUEBAS DRY,SOLID, ...MADRID NOV 21-22 2014 5. Requisitos previos, conocer bien: Las tcnicas de desarrollo / frameworks /MADRID NOV 21-22 2014libreras que se estn utilizando Metodologas, conceptos y herramientas paradesarrollar pruebas: TDD/BDD, Mocks, Stubs,Spies, Mockito, EasyMocks, etc. 6. MADRID NOV 21-22 2014Si, si suena bien, pero...Lo intent y Java EE no me lopuso fcilJava developer 7. Evolucin del desarrollo en Java EEMADRID NOV 21-22 2014JNDICMPEJB2StrutsHibernate SpringJSFJPAEJB3Seam CDIArquillianServicios decontenedorModeloPOJOInyeccin dedependenciasIntegracinframeworksFacilidad enel desarrolloFacilidadpara probarFuente: http://www.slideshare.net/nukeevry1/arquillian 8. Tipos de pruebas (automticas)MADRID NOV 21-22 2014 Pruebas unitarias Pruebas de integracin Infraestructura (contenedor / servidor de aplicaciones) Con otros sistemas/aplicaciones Pruebas funcionales 9. MADRID NOV 21-22 2014Java EE 7CDIExtensionsWebFragmentsServlet 3.1JSF 2.2JSP 2.3EL 3.0JAX-WS 2.2JAX-RS 2.0 JSON 1.0 WebSocket1.0CDI 1.1 Interceptors 1.0JTA 1.2Managed Beans 1.0JPA 2.1 JMS 2.0CommonAnnotations 1.1 Concurrency 1.0EJB 3.2JCA 1.7 Batch 1.0Bean Validations 1.1MOCKS PARA TODO? 10. Arquitectura de pruebas en Java EEMADRID NOV 21-22 2014Test CaseArquillianCore + ExtensionsShrinkWrapUnit Testing FrameworkJunit / TestNGCoverageJaCoCoMavenContainerTomEE EmbeddedOpenWebBeansEmbedded DatabaseDerby 11. MADRID NOV 21-22 2014Arquillian: caractersticas Pruebas reales Java EE sin necesidad de mocks IDE friendly: ejecucin de JUnit (o TestNG) desde el IDE o Maven Test enriquecidos: uso de caractersticas Java EE y extensiones Control del classpath: micro-despliegues en las pruebas Depuracin de las pruebas desplegadas en servidor Contenedor agnstico: mltiples adaptadores 12. Arquillian: configuracin 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 sobrescribirMADRID NOV 21-22 2014valores por defecto (opcional) 13. Arquillian: desarrollo de pruebas Crear testcase con JUnit Incluir las clases bajo prueba usando ShrinkWrap Programar los mtodos de pruebas @Test Ejecutar la prueba JUnit desde Maven / IDEMADRID NOV 21-22 2014 14. Arquillian: cdigo ejemplo test@RunWith(Arquillian.class)public class GreeterTest {MADRID NOV 21-22 2014@InjectGreeter greeter;@Deployment (name="GreeterTest")public static JavaArchive createDeployment() {return ShrinkWrap.create(JavaArchive.class).addClass(Greeter.class).addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");}@Testpublic void should_create_greeting() {Assert.fail("Not yet implemented");}} 15. Arquillian: ejecucin 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 2014Todas? Puedo? Tamao JAR/WAR de pruebas Delimitar alcance de la pruebas Consideraciones rendimiento (p.e. contexto JPA) Si se usa embedded solo incluir clases aplicacin 17. Arquillian: adaptadores runtimesMADRID 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 ejecucin Embedded Managed Remote 18. Arquillian: adaptadores runtimesRuntime Tiempo total (seg.) Tiempo test (seg.)glassfish-embedded 3.1.2.2 25 1,3openwebbeans-embedded 1.1.6 5,8 0,03jbossas-managed 7.1.1 20,4 0,3wlp-managed 8.5.1.1 31,9 2,3tomee-embedded 1.6.0 10,5 0,25Resultados de ejecutar 10 veces una prueba de una inyeccinde un EJB con @Inject.MADRID NOV 21-22 2014 19. Arquillian modos de ejecucinMADRID NOV 21-22 2014 Servidor Cliente (@RunAsClient). Ejemplo: WS REST (Arquillian REST Extension) Ambos modos son posibles a la vez 20. Context and Dependency InjectionMADRID NOV 21-22 2014 @Inject @Produce @Alternative, @Specializes 21. Creacin de alternativas (deploy)@Alternative@Specializes@Stereotype@Retention(RUNTIME)@Target(TYPE)public @interface Mock {}MADRID NOV 21-22 2014org.mycompany.testing.Mock@Mockpublic class MockLoginService extends LoginService { ...} 22. Produccin de alternativas (runtime)MADRID NOV 21-22 2014@Mock @ProducesLoginService 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/Jacksonpublic static getObjectFromXML(String xmlPath,Class className)MADRID NOV 21-22 2014 24. Arquillian Persistence ExtensionMADRID NOV 21-22 2014 Gestin de transacciones Insercin de datos en base de datos Valida datos tras la prueba Se basa en DBUnit 25. Arquillian Persistence Extensionexpected-users.ymlMADRID NOV 21-22 2014users.ymluseraccount:- id: 1firstname: Johnlastname: Smithusername: doovdepassword: password- id: 2firstname: Clarklastname: Kentusername: supermanpassword: kryptoniteuseraccount:- firstname: Johnlastname: Smithusername: doovdepassword: password- firstname: Clarklastname: Kentusername: supermanpassword: LexLuthor 26. Arquillian Persistence Extension@Test@UsingDataSet("datasets/users.yml")@ShouldMatchDataSet("datasets/expected-users.yml")public void should_change_user_password() throws Exception{// givenString expectedPassword = "LexLuthor";UserAccount user = em.find(UserAccount.class, 2L);// whenuser.setPassword(expectedPassword);user = em.merge(user);// thenassertEquals(expectedPassword, user.getPassword());MADRID NOV 21-22 2014} 27. Estrategias de pruebas: End-to-EndMADRID NOV 21-22 2014Backing BeanJPAEJBArquillianPersistence DerbyPort MockJAX-WSPruebaArquillian 28. Estrategias de pruebas: AisladasArquillianPersistence DerbyJPA Mock EJB MockBacking Bean EJB JPAMADRID NOV 21-22 2014Port MockJAX-WSPruebaArquillianPruebaArquillianPruebaArquillian 29. MADRID NOV 21-22 2014Cobertura: JaCoCo 30. MADRID NOV 21-22 2014Cobertura: JaCoCo 31. MADRID NOV 21-22 2014Cobertura: Sonar 32. Principales problemas encontrados Falta documentacin de configuraciones avanzadas Diferentes versiones de Arquillian y extensions Diferente comportamiento segn contenedoresMADRID 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 metodologa de uso para desarrolladores Integracin continua: Rompe el build! }:-)MADRID NOV 21-22 2014 34. MADRID NOV 21-22 2014FIN@josemanlopezhttps://www.linkedin.com/in/josemanlopezhttp://josemlopez.blogspot.com.es/http://goo.gl/MOi8zb