Testing + Integración continua Agenda Introducción Conceptos Herramientas CI en Arquitectura Práctica Agenda Introducción Conceptos Herramientas CI en Arquitectura Práctica Conceptos El Testing, o pruebas de software, es el proceso que verifica y revela la calidad de un proyecto/producto software. Las principales ventajas que ofrece la realización de testing son : ● Comprobar la calidad de la solución ● Detectar fallos de implementación ● Detectar comportamientos inesperados o incorrectos durante el ciclo de construcción del software ● Obliga a modularizar el software correctamente ● Reduce el tiempo de resolución de incidencias Conceptos ● Aunque exige dedicar esfuerzo (coste para las empresas) para crear y mantener los test, los beneficios obtenidos son mayores que la inversión realizada ● Permite delegar responsabilidades ya que el testing manual no se debería realizar por ningún integrante del equipo encargado de implementar la solución para evitar “vicios adquiridos” ● El testing se puede utilizar incluso para implementar funcionalidad en base a metodologías alrededor de los test (TDD) ● Tranquilidad y seguridad al equipo e indirectamente a la organización Conceptos Un test unitario es la forma de comprobar el correcto funcionamiento de un módulo de código. Nos permite comprobar que cada módulo de nuestro sistema funciona correctamente por separado Un simple servicio encargado de realizar sumas Conceptos Un test unitario es la forma de comprobar el correcto funcionamiento de un módulo de código. Nos permite comprobar que cada módulo de nuestro sistema funciona correctamente por separado Conceptos Un test de integración nos permite comprobar la integración entre varios componentes o módulos de nuestro software. ● Permite comprobar la integración entres distintos módulos de nuestra solución. ● Permita comprobar la integración con sistemas de terceros. ○ Sistemas de Mensajería JMS ○ Base de datos ○ Notificaciones ○ Etc Conceptos Un test de integración nos permite comprobar la integración entre varios componentes o módulos de nuestro software. ● Permite comprobar la integración entres distintos módulos de nuestra solución. ● Permita comprobar la integración con sistemas de terceros. ○ Sistemas de Mensajería JMS ○ Base de datos ○ Notificaciones ○ Etc App Mod. 1 Mod. 2 Conceptos Un test de integración nos permite comprobar la integración entre varios componentes o módulos de nuestro software. ● Permite comprobar la integración entres distintos módulos de nuestra solución. ● Permita comprobar la integración con sistemas de terceros. ○ Sistemas de Mensajería JMS ○ Base de datos ○ Notificaciones ○ Etc App App Mod. 1 Mod. 1 Mod. 2 Mod. 2 Conceptos Un test de integración nos permite comprobar la integración entre varios componentes o módulos de nuestro software. ● Permite comprobar la integración entres distintos módulos de nuestra solución. ● Permita comprobar la integración con sistemas de terceros. ○ Sistemas de Mensajería JMS ○ Base de datos ○ Notificaciones ○ Etc App App App Mod. 1 Mod. 1 Mod. 1 Mod. 2 Mod. 2 Mod. 2 Conceptos Un test funcional es una prueba basada en la ejecución, revisión y retroalimentación de las funcionalidades previamente diseñadas para el software (requisitos). ● Suelen formar parte de un plan de pruebas que puede ir ligado a la aceptación. ● Generan informes con el resultado de ejecución de las pruebas. ● Están escritos en lenguaje “normal”, sin tecnicismos. ○ Ej: “Cuando un usuario de administración se registre en la aplicación deberá ver todos sus expedientes pendientes.” Conceptos ● Mediante las herramientas adecuadas se pueden automatizar App a=3 b=4 res = 7 Conceptos ● Mediante las herramientas adecuadas se pueden automatizar App a=3 b=4 res = 7 App a=3 b=4 res = 7 Conceptos La cobertura de código es una medida (porcentual) que indica la cantidad de código fuente abarcado por los test ejecutados contra nuestro proyecto. Permite : ● Conocer cuánto porcentaje del código está probado. ● Detectar código no testeado. ● Fijar un porcentaje sobre el cual una entrega o proyecto puede ser considerado “NO APTO”. ○ Ej: “El grado de cobertura de código debe superar el 60%” Integración Continua Punto de partida sin integración continua : ● Los equipos trabajan de forma aislada sobre el mismo código ● Cuanto más tiempo pasan sin realizar entregas de código, más difieren las versiones entre unos y otros ● Estas situaciones pueden dar lugar al llamado “integration hell”, en el que se ha de dedicar mucho tiempo a integrar las distintas ramas de código. ○ ¿Qué sucede cuando alguien del equipo hace un commit con errores a las 20:00? ¿Problema de mi yo del mañana? Integración Continua ¿Qué és? ● Práctica de desarrollo software donde los miembros del equipo integran su trabajo frecuentemente, al menos una vez al día. ● En cada integración, se realiza lo siguiente: ○ Construcción automática de la aplicación ○ Ejecución de pruebas automáticas. ○ Comprobación de la calidad del software a través de métricas predefinidas. ● Abarca todo el ciclo de vida de construcción de la solución: ○ Compilación -> Test Unitarios -> Test Integración -> Test Funcionales > Test QA -> Despliegue (puesta producción) Integración Continua Control de versiones Equipos de desarrollo Análisis de código Construcción automática Provisionamiento y despliegue de la aplicación Reportes Tests Integración Tests funcionales Tests unitarios Este flujo de trabajo se realiza en cada entrega al repositorio Integración Continua ● Se puede realizar sin intervención humana ○ ● Cada fase se realiza mediante herramientas automatizadas Cada ciclo genera informes que son almacenados para su consulta en base a: ● ○ las métricas del software, ○ las pruebas unitarias, ○ los test de integración. Las tareas de construcción son orquestadas y mantenidas por el servidor de Integración continua. Sistematización Automatización Detección temprana Errores Mejores prácticas ● Mantener un solo repositorio, con ramas. ● Automatizar la construcción ● Hacerla auto-testeable ● Todo el mundo entrega el código todos los días ● Notificaciones instantáneas ● Está permitido cometer errores ● Las pruebas se realizan en un clon de producción ● Hacer fácil la obtención de los entregables ● Visibilidad de las builds ● Automatizar el despliegue Beneficios generales ● Reduce tiempo, coste y retrabajos al evitar los “integration hells” ● Proporciona feedback rápido del impacto en el proyecto de los cambios realizados ● El proceso comprueba la calidad del software constantemente lo que permite asegurar la calidad del producto en base a su consistencia ● Permite evaluar la mejora/empeoramiento del producto ● Detección y notificación temprana de errores ● Permite la refactorización del código con mayores garantías “Continuous Integration doesn’t get rid of bugs, but it does make them dramatically easier to find and remove.” Martin Fowler, Chief Scientist, ThoughtWorks Beneficios generales ● Los errores son detectados con mayor rapidez y solucionados con poca inversión. ● Evita el “caos del último minuto” en la fecha de entrega ● Facilita poder revertir código a una versión estable (la última) ● Versión funcional siempre disponible para los stakeholders ● La frecuencia de las entregas fuerza al desarrollo de aplicaciones más modulares con código menos complejo y más modular. Beneficios de las pruebas automáticas ● Fuerza la disciplina y buena práctica de probar a menudo de manera automática ● Feedback automático y continuo del impacto en todo el sistema de cambios localizados ● Facilita y agiliza la corrección de problemas durante el desarrollo ● Las métricas generadas dan feedback inmediato a los desarrolladores ● Todas las pruebas automáticas se convierten en pruebas de regresión Continuous delivery (entregas continuas) ● Práctica que permite tener siempre disponible un producto que cumple con las normas de calidad impuestas ● Estabilización temprana del código. Al hacer deliver en cada push, el código ha de ser estable. ● La aplicación está construida y lista para desplegar manualmente ● Evita cuellos de botella en puestas en marcha simultáneas ○ En algunos entornos se compilan todas las apps en la puesta en marcha ○ La ventana de tiempo disponible es pequeña Continuous deployment (despliegues continuos) ● Práctica de realizar la puesta en marcha “en producción” de un producto de forma automática si pasa todo el ciclo de calidad previsto ● Las pruebas automáticas deben cubrir el 100% de los casos ● Difícil de conseguir con aplicaciones con muchas dependencias externas ● Monitorización automática en producción de la puesta en marcha ● Empleado en empresas muy enfocadas a la tecnología ● El tiempo desde la programación hasta la puesta en marcha se reduce a horas Agenda Introducción Conceptos Herramientas CI en Arquitectura Práctica Herramientas: Maven ● Herramienta para la gestión y construcción de aplicaciones. ● Facilita la gestión del ciclo de construcción de proyectos software. ● Permite la reutilización de la lógica de construcción. ● Gestión de librerías y dependencias entre módulos y proyectos. ● Gran cantidad de plugins disponibles. Herramientas: Subversion / GIT ● Herramienta de control de versiones y repositorio de código fuente. ● Sistema centralizado. ● Gestión de históricos de los cambios realizados sobre los ficheros. ● Facilita la ramificación de los proyectos. ● Permite etiquetar los proyectos y su versionamiento. Herramientas: Nexus ● Sistema de control y almacenamiento de librerías o artefactos. ● Permite centralizar en un único punto la gestión de las dependencias. ● Sirve como repositorio donde instalar los artefactos generados por los proyectos. ● Permite versionado de artefactos. ● Gestiona los dos estados de desarrollo de un artefacto (snapshot y release). Herramientas: Nexus Herramientas: Jenkins ● Herramienta de integración continua. ● Identifica las distintas tareas en jobs. ● Mantiene un histórico de la ejecución y el resultado de los mismos. ● Los jobs son altamente configurables, permitiendo lanzar desde compilaciones de aplicaciones java, android, iOs, hasta deploys contra servidores de aplicaciones. ● Notifica a los afectados en caso de eventualidades. ● Monitorización de resultados. ● Enorme cantidad de plugins disponible. Herramientas: Jenkins Herramientas: Jenkins Herramientas: Jenkins Herramientas: Sonarqube ● Herramienta utilizada para evaluar la calidad del software. ● Recopila, analiza y permite visualizar las métricas de la calidad del software. ● Realiza análisis estático del código en función de unas reglas configurables y ampliables. ● Nos permite conocer el porcentaje de cumplimiento de las reglas en los proyectos. ● Monitoriza la evolución de la calidad. Herramientas: Sonar Herramientas: TestLink ● Herramienta de gestión de pruebas ● Afianza la calidad del software ● Permite crear y gestionar casos de prueba ● Organiza los casos de prueba en planes de pruebas ● Gestiona y publica los resultados de los test ● Trazabilidad con los requisitos Herramientas: TestLink Herramientas: Sahi ● Herramienta para la automatización de pruebas de capa vista. ● Permite la grabación de casos de prueba y la posterior reproducción. ● Permite ampliar la funcionalidad mediante scripts. ● Generación de informes detallados. ● Versiones para los sistemas operativos y navegadores más conocidos. ● Integrado con Jenkins para lanzar la ejecución de las pruebas desde las tareas. Herramientas: Sahi Herramientas gestión: Visual Management ● Herramienta de gestión de tareas. ● Panel de visualización de tareas basado en Kanban ● Basada en metodología ágil. ● Permite tener una visión global del estado del proyecto y responder ágilmente ante eventualidades. ● Integrado con las herramientas corporativas para la gestión del proyecto (Teamforge y logbook). Herramientas gestión: Visual Management Agenda Introducción Conceptos Herramientas CI en Arquitectura Práctica CI en Arquitectura Desarrollador CI en Arquitectura Control de versiones Desarrollador CI en Arquitectura Control de versiones Desarrollador Compilación CI en Arquitectura Control de versiones Desarrollador Compilación Test Unitarios CI en Arquitectura Control de versiones Desarrollador Compilación Test Unitarios Control de calidad CI en Arquitectura Control de versiones Desarrollador Compilación Test Unitarios Control de calidad Deploy PreITG CI en Arquitectura Control de versiones Desarrollador Análisis código Compilación Publica documentación Test Unitarios Control de calidad Despliega aplicaciones Deploy PreITG Instala librerías Test Integración Sahi Infraestructura CI ● Los entornos de integración continua tienen detrás una infraestructura adaptada a la complejidad de las soluciones que integre. ● La complejidad puede variar desde la ejecución de los test, siendo este punto el más simple, hasta la creación completa de entornos con herramientas de aprovisionamiento. Infraestructura CI 5 Servidores 29 VMs IBM Cisco Preguntas Agenda Introducción Conceptos Herramientas CI en Arquitectura Práctica Demo ● Proyecto FWK3 entorno local ● Tarea Jenkins asociada a proyecto ○ Commit erróneo ● Sonar FWK3 ● Deploy Nexus FWK3 ● Informes Generados ● Documentación publicada Práctica ejercicios Testing https://github.com/joseripla/uvtesting Preguntas jplapons@capgemini.com www.capgemini.com