Cobertura de Código con Tests Funcionales
-
Upload
atsistemas -
Category
Software
-
view
112 -
download
0
Transcript of 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
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.
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
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
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
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.
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.
what´s up in tech
Víctor [email protected]
Cobertura de código con test funcionales para
Superhéroes de hoy en día
what´s up in tech
Índice
• Introducción• Conceptos• Demo• Conclusiones
what´s up in tech
Introducción
what´s up in tech
Zona de Confort Zona de Trabajo
Introducción
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
what´s up in tech
Conceptos
what´s up in tech
Teoría de la Ventana Rota
what´s up in tech
Problema del Billón de Dólares
what´s up in tech
Desarrollo vs. Testing
Teoría de “mi” / “tu” criatura
what´s up in tech
Automatización
• XXX• XXX
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
what´s up in tech
Cobertura Código
• XXX• XXX
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.
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
what´s up in tech
Resolver el Problema
• XXX• XXX
what´s up in tech
Demo
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”
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
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
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
what´s up in tech
Estructura de Proyectos
bat-architecture-testingbat-architecture-commons
bat-desk
bat-desk-common
bat-desk-web
bat-villain-core
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
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());}
}
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
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());}
}
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"));}
}
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
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
what´s up in tech
Conclusiones
what´s up in tech
Yo soy … QAtman !!!
• XXX• XXX
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
what´s up in tech
MADRID BARCELONA CÁDIZ ZARAGOZA A CORUÑA
9 0 2 8 8 8 9 0 2
what´s up in tech