Etapas de prueba en integración continua y entrega continua
Los tres equipos de CI/CD deben incorporar las pruebas en el ciclo de vida de desarrollo de software en las diferentes etapas de la canalización de CI/CD. En general, las pruebas deben comenzar lo antes posible. La siguiente pirámide de pruebas es un concepto proporcionado por Mike Cohn en Succeeding with Agile. Muestra las diversas pruebas de software en relación con su coste y velocidad a la que se ejecutan.
Pirámide de pruebas de CI/CD
Las pruebas unitarias están en la parte inferior de la pirámide. Son las más rápidas de ejecutar y las menos costosas. Por lo tanto, las pruebas unitarias deben constituir la mayor parte de su estrategia de pruebas. Una buena regla general es alrededor del 70 por ciento. Las pruebas unitarias deben tener una cobertura de código casi completa porque los errores detectados en esta fase se pueden corregir de forma rápida y económica.
Las pruebas de servicio, componentes e integración están en la pirámide por encima de las pruebas unitarias. Estas pruebas requieren entornos detallados y, por lo tanto, son más costosas en cuanto a requisitos de infraestructura y más lentas de ejecutar. Las pruebas de rendimiento y cumplimiento son el siguiente nivel. Requieren entornos de calidad de producción y son aún más caras. Las pruebas de aceptación de la interfaz de usuario y de usuario están en la parte superior de la pirámide y también requieren entornos de calidad de producción.
Todas estas pruebas forman parte de una estrategia completa para garantizar un software de alta calidad. Sin embargo, para acelerar el desarrollo, se hace hincapié en el número de pruebas y la cobertura en la mitad inferior de la pirámide.
En las siguientes secciones se analizan las etapas de la CI/CD.
Configuración del origen
Al principio del proyecto, es esencial configurar un origen en el que poder almacenar el código sin procesar y los cambios de configuración y esquema. En la etapa de origen, elija un repositorio de código fuente, como uno alojado en GitHub o AWS CodeCommit.
Configuración y ejecución de compilaciones
La automatización de compilaciones es esencial para el proceso de CI. Al configurar la automatización de compilaciones, la primera tarea es elegir la herramienta de compilación correcta. Existen muchas herramientas de compilación, tales como:
-
Ant, Maven, y Gradle para Java
-
Make para C/C++
-
Grunt para JavaScript
-
Rake para Ruby
La herramienta de compilación que funcione mejor para usted depende del lenguaje de programación de su proyecto y del conjunto de habilidades de su equipo. Después de elegir la herramienta de compilación, todas las dependencias deben definirse claramente en los scripts de compilación, junto con los pasos de compilación. También se recomienda crear una versión de los artefactos de compilación finales, lo que facilita la implementación y el seguimiento de los problemas.
Compilación
En la etapa de compilación, las herramientas de compilación tomarán como entrada cualquier cambio en el repositorio de código fuente, compilarán el software y ejecutarán los siguientes tipos de pruebas:
Pruebas unitarias: prueba una sección específica del código para garantizar que el código hace lo que se espera que haga. Los desarrolladores de software realizan las pruebas unitarias durante la fase de desarrollo. En esta etapa, se puede aplicar un análisis de código estático, un análisis de flujo de datos, una cobertura de código y otros procesos de verificación de software.
Análisis de código estático: esta prueba se realiza sin ejecutar la aplicación después de las pruebas de compilación y unitarias. Este análisis puede ayudar a encontrar errores de codificación y agujeros de seguridad, y también puede garantizar el cumplimiento de las pautas de codificación.
Almacenamiento provisional
En la fase de ensayo, se crean entornos completos que reflejan el entorno de producción final. Se llevan a cabo las siguientes pruebas:
Pruebas de integración: verifica las interfaces entre los componentes en relación con el diseño del software. Las pruebas de integración son un proceso iterativo y facilitan la creación de interfaces robustas y la integridad del sistema.
Pruebas de componentes: prueba el paso de mensajes entre varios componentes y sus resultados. Un objetivo clave de estas pruebas podría ser la idempotencia en las pruebas de componentes. Las pruebas pueden incluir volúmenes de datos extremadamente grandes o situaciones perimetrales y entradas anómalas.
Pruebas del sistema: prueba el sistema de extremo a extremo y verifica si el software cumple con los requisitos comerciales. Esto puede incluir probar la interfaz de usuario (IU), la API, la lógica de backend y el estado final.
Pruebas de rendimiento: determina la capacidad de respuesta y la estabilidad de un sistema a medida que se desempeña bajo una carga de trabajo en particular. Las pruebas de rendimiento también se utilizan para investigar, medir, validar o verificar otros atributos de calidad del sistema, como la escalabilidad, la fiabilidad y el uso de recursos. Los tipos de pruebas de rendimiento pueden incluir pruebas de carga, pruebas de esfuerzo y pruebas de picos. Las pruebas de rendimiento se utilizan para la evaluación comparativa con criterios predefinidos.
Pruebas de cumplimiento: comprueba si el cambio de código cumple con los requisitos de una especificación o reglamento no funcional. Determina si está implementando y cumpliendo con los estándares definidos.
Pruebas de aceptación del usuario: valida el flujo empresarial de extremo a extremo. Esta prueba la ejecuta un usuario final en un entorno de ensayo y confirma si el sistema cumple con los requisitos de la especificación de requisitos. Por lo general, los clientes emplean metodologías de prueba alfa y beta en esta etapa.
Producción
Finalmente, después de pasar las pruebas anteriores, la fase de ensayo se repite en un entorno de producción. En esta fase, se puede completar una prueba de valor controlado final implementando el nuevo código solo en un pequeño subconjunto de servidores o incluso en un servidor, o uno Región de AWS antes de implementar el código en todo el entorno de producción. Los detalles sobre cómo implementar de forma segura en producción se tratan en la sección Métodos de implementación.
En la siguiente sección se analiza la creación de la canalización para incorporar estas etapas y pruebas.