Cobertura de Código con Tests Funcionales

39
what´s up in tech 10 de noviembre de 2016 Cobertura de código con test funcionales para Superhéroes de hoy en día

Transcript of Cobertura de Código con Tests Funcionales

Page 1: Cobertura de Código con Tests Funcionales

what´s up in tech

10 de noviembre de 2016

Cobertura de código con test funcionales para

Superhéroes de hoy en día

Page 2: Cobertura de Código con Tests Funcionales

what´s up in tech

Ponentes

Lorena Bourg

Responsable de la Línea de Negocio de QA & Testing en atSistemas Licenciada en Cs de la Computación Más de 8 años de experiencia en

gestión de proyectos internacionales Investigación en métodos formales

para la verificación de sistemas críticos.

[email protected]

Víctor Madrid

Miembro de Oficina Técnica en atSistemas Ingeniero en Informática Más de 12 años de experiencia

en análisis y desarrollo de aplicaciones

Especialista en tecnologías Java y frameworks Open source

[email protected]

Page 3: Cobertura de Código con Tests Funcionales

what´s up in tech

Lorena [email protected]

Presentación de Servicios

Page 4: Cobertura de Código con Tests Funcionales

what´s up in tech

Nuestros Servicios

Consultoría: Diagnóstico de situación, consultoría metodológica, estratégica, táctica y operativa, auditorías, implantación de Oficina de Calidad

Testing & Quality Assurance (QA): Actividades de testing y QA en las instalaciones del cliente, Testing as a Service, Servicio Nearshore. Testing de aplicaciones móviles, web, funcional, manual y automático.

Formación: Técnica y metodológica

Page 5: Cobertura de Código con Tests Funcionales

what´s up in tech

Consultoría

• Análisis del proceso de desarrollo y testing actual del cliente y de sus necesidades.

• Consultoría metodológica, estratégica, táctica y operativa.• Definición de mínimos de calidad, buenas prácticas, entornos de

desarrollo y testing.• Definición de procedimientos y herramientas para el aseguramiento de

la calidad de los desarrollos• Auditorías• Implantación de Oficina de Calidad

Page 6: Cobertura de Código con Tests Funcionales

what´s up in tech

Testing&QA

• Test unitarios/funcionales, Pruebas de Sistema, Pruebas de Seguridad, Pruebas de Carga/Rendimiento, Análisis Estático de Código.

• Automatización de pruebas de regresión.

• Mobile testing: Testing de aplicaciones nativas, híbridas en granjas de dispositivos. Automatización de pruebas funcionales. Monitorización. MLM.

Page 7: Cobertura de Código con Tests Funcionales

what´s up in tech

Formación

• En las instalaciones del cliente o de forma remota. Webinars.

• Formación técnica: Uso y despliegue de entornos y herramientas de testing: SonarQube, Selenium, JUnit, Zephyr, appium, etc.

• Formación metodológica: Buenas prácticas de codificación, desarrollo y testing, TMMI.

Page 8: Cobertura de Código con Tests Funcionales

what´s up in tech

Víctor [email protected]

Cobertura de código con test funcionales para

Superhéroes de hoy en día

Page 9: Cobertura de Código con Tests Funcionales

what´s up in tech

Índice

• Introducción• Conceptos• Demo• Conclusiones

Page 10: Cobertura de Código con Tests Funcionales

what´s up in tech

Introducción

Page 11: Cobertura de Código con Tests Funcionales

what´s up in tech

Zona de Confort Zona de Trabajo

Introducción

Page 12: Cobertura de Código con Tests Funcionales

what´s up in tech

Golpe de Realidad

• Años “Malas” prácticas• Falta de una arquitectura clara• Implantaciones poco pensadas• Formación poco adecuada• Pérdida de conocimiento• No querer cambiar las cosas• Factor “Mágico”• Etc.

Teoría del DuendeTeoría del Plan de Carrera del Duende

Page 13: Cobertura de Código con Tests Funcionales

what´s up in tech

Conceptos

Page 14: Cobertura de Código con Tests Funcionales

what´s up in tech

Teoría de la Ventana Rota

Page 15: Cobertura de Código con Tests Funcionales

what´s up in tech

Problema del Billón de Dólares

Page 16: Cobertura de Código con Tests Funcionales

what´s up in tech

Desarrollo vs. Testing

Teoría de “mi” / “tu” criatura

Page 17: Cobertura de Código con Tests Funcionales

what´s up in tech

Automatización

• XXX• XXX

Page 18: Cobertura de Código con Tests Funcionales

what´s up in tech

Pruebas Básicas

Pruebas Unitarias• Prueba la funcionalidad del

código• Realizado por los

desarrolladores• No pueden acceder a los

recursos externos (no acceden a la red, ni BD, etc.)

• Asociados al perfil de desarrollo “development”

• Automatización• Muy mala práctica no

realizarlos• Enfoque “caja blanca”• Pieza clave en la metodología

TDD

Pruebas Integración• Pruebas relacionadas con el

acceso a datos o con el uso de otros componentes -> Relación con otras partes

• Realizado por los desarrolladores

• Asociados al perfil de desarrollo “integration”

• Automatización• Muy mala práctica no

realizarlos• Enfoque “caja blanca”• Requieren configuración • Por ejemplo : Spring

• Técnicas :• Top down• Bottom up• Big bang• etc.

Pruebas Funcionales• Pruebas relacionadas con el

funcionamiento del sistema, comprueba que se cumplan las funciones específicas para las cuales han sido desarrollado

• Realizado por los analistas funcionales y clientes

• Enfoque “caja negra”• Automatización• El nivel de conocimiento de

negocio del tester tiene que ser similar al del cliente

Page 19: Cobertura de Código con Tests Funcionales

what´s up in tech

Cobertura Código

• XXX• XXX

Page 20: Cobertura de Código con Tests Funcionales

what´s up in tech

Filosofía Kaizen

• XXX• XXX

Principios:• "¡Hoy mejor que ayer, mañana mejor que hoy!“• “Un campos rápido e imperfecto es mejor que un cambio perfecto pero tardío”• Conseguir rápidamente unas mejoras y unos resultados visibles sabiendo que las

soluciones tienen valor cuando están implantadas.• Participación de todos :se trata de fomentar muchas ideas en la organización en

todos los niveles.

Page 21: Cobertura de Código con Tests Funcionales

what´s up in tech

Buenas Prácticas• SOLID

• Principio Navaja de Ockham / Occam : “En igualdad de condiciones, la explicación más sencilla suele ser la correcta”

• Regla Boy Scout : “Siempre deja el lugar de acampada más limpio que como lo encontraste”

• Ley de Finagle : “Algo que pueda ir mal, irá mal en el peor momento posible”

• Principio de Hanlon : “Nunca atribuyas a la maldad lo que puede ser explicado por la estupidez”

• Principio K.I.S.S. (Keep It Simple, Stupid / Smart) : “Mantenlo sencillo, estúpido”

• Principio YAGNI (You Aren’t Gonna Need It) : “No vas a necesitarlo”

• GRASP (General Responsibility Assigment Software Patterns)

• Patrones / Antipatrones / Olores

• Refactoring

• TDD, BDD, etc

• Programación por parejas, técnicas de pomodoro, etc

• “El arte del código que entiendan los humanos”

• … y muchas cosas más

Page 22: Cobertura de Código con Tests Funcionales

what´s up in tech

Resolver el Problema

• XXX• XXX

Page 23: Cobertura de Código con Tests Funcionales

what´s up in tech

Demo

Page 24: Cobertura de Código con Tests Funcionales

what´s up in tech

Contexto• Nuestro jefe : Bruce Wayne / Batman• NO se puede desvelar ninguna identidad• Existe una empresa : WAYNE ENTERPRISE

– Filial : WAYNE Consulting • Cualquier desarrollo (*) lo tiene que implementar en su

mayoría un proveedor externo– No hay tiempo/dinero/recursos para realizar un desarrollo propio entero, pero

sí para realizar adaptaciones del código– Ocultar al máximo el objetivo final : Por ejemplo solicitar un CRUD de

Funcionarios

(*)“TOP SECRET”• NO puede existir documentación o referencias a metodologías de desarrollo / funcionalidad / testing / QA• Utilización de una Arquitectura Open Source basada en Java con tecnologías actuales• Uso de buenas prácticas de desarrollo• A realizar en : “2 semanas como máximo” -> “Seguro que son 2 “if-then-else” y 4 pantallas”

Page 25: Cobertura de Código con Tests Funcionales

what´s up in tech

OrganizaciónBatman Inc.• Batman tiene una organización global : Batman Inc. • Sistema de Franquicia• Problema : Cada país tiene su propias leyes• Facilita proyectos / librerías de arquitectura de Batman :

– bat-architecture-testing– bat-architecture-common

Ejemplo : Somos … Batman Madrid• Nos regimos por las leyes Europeas y de España• Regla básica : “NO matamos pero SÍ detenemos”• Problema : En España NO dominamos mucho el inglés

Page 26: Cobertura de Código con Tests Funcionales

what´s up in tech

Necesidades

• Batman Madrid necesita una nueva aplicación web para la gestión de villanos, gestión de recursos , imputación de horas, etc. – bat-desk

• Ayuda Extra : Somos muy amigos de “Batman Londres” y nos ha facilitado el módulo de villanos (*) (casi lo tiene implementado ) porque es muy parecido a lo que nosotros necesitamos– bat-villain-core

(*) Opciones :Caso 1 : Librería de TercerosCaso 2 : Integración totalCaso 3 : Módulo

Page 27: Cobertura de Código con Tests Funcionales

what´s up in tech

Stack Tecnológico

• Arquitectura basada en tecnología : Java

• Herramienta de construcción automática : Maven

• Trazas de la aplicación : Logback

• Framework de Spring y Spring MVC

• Spring Boot

• Persistencia de datos : Mybatis

• Servidores Embebidos (servidor ligero embebido) : Tomcat

• Bases de datos Embebidas (BD que se crea y se utiliza en memoria) : H2

• Tracking , gestión y aplicación de cambios en base de datos : Liquibase

• Frameworks de test unitarios y de integración : JUnit

• Mocking (creación de objetos simulados) : Mockito

• Framework de matchers (facilita comprobaciones) :

Hamcrest

• Frameworks de test funcionales : Selenium

• Navegador (navegador sin interfaz grafica basado en

Webkit): Phantom.js• WebDriver para PhantomJS, : Ghost Driver

• Wrapper de Selenium : Fluentlenium

• Cobertura del código : Porcentaje de código accedido

por test : Cobertura

Cobertura

Tecnologías Desarrollo Tecnologías Testing

Page 28: Cobertura de Código con Tests Funcionales

what´s up in tech

Estructura de Proyectos

bat-architecture-testingbat-architecture-commons

bat-desk

bat-desk-common

bat-desk-web

bat-villain-core

Page 29: Cobertura de Código con Tests Funcionales

what´s up in tech

Código Servicio de “Detención”

Estados :• Libre (FREE)• Detenido(DETAINED)• Muerto(DEAD)

@Service("villainOperationService")public class VillainOperationServiceImpl implements VillainOperationService {

…@Overridepublic void detain(long villainId) throws BatDeskException {

LOG.trace("Detaining Villain with id : {}", villainId);

final Villain villain = villainMapper.findByPK(villainId);

generateNotFoundException(villain);

if (VillainValidation.INSTANCE.isDead(villain)){throw new BatDeskException(VillainTypeExceptionEnum.IS_DEAD.name());

}

if (VillainValidation.INSTANCE.isDetained(villain)){throw new BatDeskException(VillainTypeExceptionEnum.IS_DETAINED.name());

}

villain.setStatus(VillainStatusEnum.DETAINED);

if (villainMapper.update(villain) == 0) {throw new BatDeskException(VillainTypeExceptionEnum.DB_ERROR.name());

}

LOG.trace("Villain detained with id : {}", villainId);}…

}

Importante :Este servicio se encuentra en el módulo : bat-villain-core

Page 30: Cobertura de Código con Tests Funcionales

what´s up in tech

Código Test : Servicio de “Detención”

public class VillainOperationServiceTest {private VillainOperationServiceImpl villainOperationService;private VillainMapper villainMapper;private Villain villainTest;

@Beforepublic void initTests() {

...}

@Test (expected=BatDeskException.class)public void shouldDetainNotFoundException() throws BatDeskException {

when(villainMapper.findByPK(anyLong())).thenReturn(null);

villainOperationService.detain(VillainConstant.TEST_ID);}

@Test (expected=BatDeskException.class)public void shouldDetainWithDeadStatusException() throws BatDeskException {

villainTest.setStatus(VillainStatusEnum.DEAD);

villainOperationService.detain(VillainConstant.TEST_ID);}

@Testpublic void shouldDetain() throws BatDeskException {

villainTest.setStatus(VillainStatusEnum.FREE);when(villainMapper.update(villainTest)).thenReturn(1);

villainOperationService.detain(VillainConstant.TEST_ID);

assertEquals(VillainStatusEnum.DETAINED,villainTest.getStatus());}

}

Page 31: Cobertura de Código con Tests Funcionales

what´s up in tech

Código Controlador de “Detención”@Controller("villainController")@RequestMapping(value = "/villain/*")public class VillainController {

...@RequestMapping(value = "/detain", method = RequestMethod.GET)public ModelAndView detain(@RequestParam("id") Long villainId, HttpServletRequest request, final RedirectAttributes redirectAttributes) {

LOG.info("Detaining Villain with id : {}", villainId);ModelAndView modelAndView = new ModelAndView(ViewConstant.REDIRECT_LIST_REQUEST_MAPPING);

Villain villainFound = villainService.findByPK(villainId);

if (!VillainValidation.INSTANCE.isValid(villainFound)) {final String error = messageSource.getMessage("villain.validation.error.NOT_FOUND", new Object[] { villainId }, RequestContextUtils.getLocale(request) );modelAndView.addObject(ParameterConstant.PARAM_EXCEPTION, error);modelAndView.setViewName(ViewConstant.ERROR_VIEW);

} else {

try {villainOperationService.detain(villainId);final String success = messageSource.getMessage("villain.validation.IS_DETAINED", new Object[] { villainId }, RequestContextUtils.getLocale(request) );redirectAttributes.addFlashAttribute(ParameterConstant.PARAM_MESSAGE, success);LOG.info("Villain with id {} is detained", villainId);

} catch (BatDeskException e) {LOG.error("BatDeskException : Villain with id {} not detained by '{}'", villainId, e.getMessage());final String error = messageSource.getMessage("villain.validation.error."+e.getMessage(), new Object[] { villainId }, RequestContextUtils.getLocale(request) );redirectAttributes.addFlashAttribute(ParameterConstant.PARAM_EXCEPTION, error );

}}

return modelAndView;}...

}

Importante :Este servicio se encuentra en el módulo : bat-desk-webNota : Se puede mejorar el tratamiento de la vista con un elemento tipo “View Resolver” y eliminar la doble comprobación de “si existe” -> Este ejemplo es didáctico

Page 32: Cobertura de Código con Tests Funcionales

what´s up in tech

Código Test : Controlador de “Detención”public class VillainControllerTest {

private final String MESSAGE_SOURCE_VALUE = "TEST";private VillainController villainController;private VillainService villainService;private VillainOperationService villainOperationService;...@Beforepublic final void setUp() throws Exception {

…villainController = spy(new VillainController());villainService = mock(VillainService.class);villainOperationService = mock(VillainOperationService.class);…when(messageSource.getMessage(anyString(), any(Object[].class), anyObject())).thenReturn(MESSAGE_SOURCE_VALUE);when(villainService.findByPK(anyLong())).thenReturn(villainTest);

}

@Testpublic final void shouldBeDetainNoFound() {

when(villainService.findByPK(anyLong())).thenReturn(null);final ModelAndView modelAndView = villainController.detain(VillainConstant.TEST_ID, request, redirectAttributes);final String message = (String) modelAndView.getModel().get(ParameterConstant.PARAM_EXCEPTION);assertEquals(ViewConstant.ERROR_VIEW,modelAndView.getViewName());assertEquals(MESSAGE_SOURCE_VALUE,message);

}

@Testpublic final void shouldBeDetain() throws BatDeskException {

final ModelAndView modelAndView = villainController.detain(VillainConstant.TEST_ID, request, redirectAttributes);

assertEquals(ViewConstant.REDIRECT_LIST_REQUEST_MAPPING,modelAndView.getViewName());}

}

Page 33: Cobertura de Código con Tests Funcionales

what´s up in tech

Código Test Funcional de “Detención”@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = SpringBootWebApplication.class)@WebAppConfiguration@IntegrationTest("server.port:8080")public class DetainSeleniumIT extends FluentTest {

private final String NAVIGATION_VILLAIN_LIST = "navigation_villain_list";@Value("${local.server.port}")private int serverPort;private WebDriver webDriver = new PhantomJSDriver();

@Testpublic void testBatDeskPage_Dead() { goTo(getUrl()); // Villain List find(By.id(NAVIGATION_VILLAIN_LIST)).click(); // Detain Dead Villain find(By.id("detain_4")).click(); find(By.id("notificationException"));}

@Testpublic void testBatDeskPage_Free() { goTo(getUrl()); // Villain List find(By.id(NAVIGATION_VILLAIN_LIST)).click(); // Detain Free Villain find(By.id("detain_1")).click(); find(By.id("notificationMessage"));}

}

Page 34: Cobertura de Código con Tests Funcionales

what´s up in tech

Despliegue “Bat-Desk”

• Arranque con Spring Boot bat-desk> bat-desk-web> mvn spring-boot:run

• Despliegue automático en Tomcat Embebidohttp://localhost:8080/bat-desk

Page 35: Cobertura de Código con Tests Funcionales

what´s up in tech

Reporting “Cobertura”• Informe de cobertura de código integrado en el “site”• Opcional : Ejecución con diferentes perfiles

bat-desk> mvn clean site -Pintegration-tests

Page 36: Cobertura de Código con Tests Funcionales

what´s up in tech

Conclusiones

Page 37: Cobertura de Código con Tests Funcionales

what´s up in tech

Yo soy … QAtman !!!

• XXX• XXX

Page 38: Cobertura de Código con Tests Funcionales

what´s up in tech

atSistemas – LoB QA & TestingNuestros servicios end-to-end

o Diagnóstico de situación, o Consultoría metodológica, estraté-

gica, táctica y operativa. o Definición de mínimos de calidad, y

buenas prácticas, o Auditorías. o Implantación de Oficina de Calidad.

Consultoría

o Actividades de testing y QA en las instalaciones del cliente.

o Testing as a Service.o Servicio Nearshore.o Testing de aplicaciones móviles, web,

funcional, manual y automático.

Testing & Quality Assurance

o En las instalaciones del cliente o remota. Webinars.

o Formación técnica: SonarQube, Selenium, JUnit, Zephyr, appium, etc.

o Formación metodológica: Buenas prácticas de codificación, desarrollo y testing, TMMI.

Formación