X
BLOG

Optimice las pruebas de software integrado con un flujo de trabajo de CI / CD

Optimice las pruebas de software integrado con un flujo de trabajo de CI / CD Tiempo de leer: 7 minutos

La implementación de un flujo de trabajo de integración continua y entrega continua (CI / CD) para el desarrollo de software integrado se está volviendo cada vez más popular. Los proyectos de software embebido a menudo están restringidos de formas en que el desarrollo de aplicaciones no lo está. Además de las limitaciones físicas y computacionales de la plataforma de hardware de destino, existen limitaciones en el mercado.

El mercado integrado tiende a tener requisitos únicos de seguridad, protección y privacidad junto con ciclos de vida extremadamente largos. Los productos pueden permanecer en el mercado durante décadas.

Los desafíos de las pruebas de software integrado

Automatizar las pruebas para software integrado es un desafío debido a la necesidad y complejidad de iniciar y observar pruebas en objetivos integrados. Además, los equipos de software suelen tener acceso limitado al hardware de destino.

La automatización de las pruebas de software es esencial para que las pruebas integradas funcionen de forma continua desde el sistema de desarrollo del host hasta el sistema de destino. Probar el software integrado requiere mucho tiempo. Automatizar el conjunto de pruebas de regresión proporciona importantes ahorros de tiempo y costos.

Conceptos básicos para probar software integrado

Los resultados de las pruebas y la recopilación de datos de cobertura de código del sistema de destino son esenciales para la validación y el cumplimiento de los estándares, según sea necesario. Y la recopilación de datos es fundamental en la ejecución de la prueba. Se puede lograr registrando y manteniendo la trazabilidad entre los casos de prueba, los resultados de las pruebas, el código fuente y los requisitos.

Las soluciones de prueba integradas, como la prueba Parasoft C / C ++, ofrecen un arnés de prueba optimizado para tomar una sobrecarga adicional mínima para la huella binaria y proporcionarla en forma de código fuente, donde se puede personalizar si se requieren modificaciones específicas de la plataforma.

Infografía que muestra que el host (izquierda) es una prueba de C / C ++ como agente de escucha. El hardware de destino (derecha) es la biblioteca en tiempo de ejecución como módulo de comunicación que apunta al canal de comunicación al agente de escucha y luego se implementa en Test Executable (arriba a la derecha debajo de hardware de destino).

Automatice las pruebas de software integrado

Existen soluciones que brindan integraciones dedicadas con IDE y depuradores integrados para que el proceso de ejecución de casos de prueba sea fluido y automatizado. La solución de prueba de Parasoft para el desarrollo de software c / c ++ admite la creación de líneas de base de prueba de regresión como una colección organizada de pruebas y verifica automáticamente todos los resultados. Estas pruebas se ejecutan automáticamente de forma regular para verificar si las modificaciones del código cambian o rompen la funcionalidad capturada en las pruebas de regresión.

Si se introducen cambios, estos casos de prueba no alertarán al equipo sobre el problema. Durante las pruebas posteriores, Prueba de Parasoft C ++ informará de las tareas si detecta cambios en el comportamiento capturado en la prueba inicial.

La paridad de las capacidades de ejecución de destino remoto con las pruebas basadas en host significa que los equipos de software integrado pueden obtener los mismos beneficios de la automatización que cualquier otro tipo de desarrollo de aplicaciones.

La automatización es importante, pero debe hacer más que mantener el status quo. Para mejorar la seguridad, la protección y la calidad del software, se necesitan más pruebas dentro de la canalización de CI / CD sin retrasar aún más el progreso.

Mejore la automatización de pruebas para optimizar CI / CD para software integrado

La lucha más grande que enfrentan los equipos es cómo mejorar la eficiencia de las pruebas y al mismo tiempo satisfacer las necesidades de seguridad, protección y calidad sin afectar los horarios y los costos. Inevitablemente, incluso con una simple automatización de pruebas (ejecución de pruebas y resultados), existen compromisos necesarios para mantener un tiempo de prueba razonable.

La solución simple es seleccionar, con conjeturas, qué partes del software probar como conjuntos de pruebas del sistema completo requieren demasiado tiempo y son costosos. Los equipos de software integrado necesitan aumentar sus pruebas y, al mismo tiempo, centrarse en las pruebas exactamente en lo que se necesita. La optimización de las pruebas mediante una automatización de pruebas más inteligente elimina las conjeturas a la hora de crear y ejecutar pruebas.

Optimice las pruebas con cobertura de código

En general, la cobertura de código es una medida de la cantidad de código de producción que se ejecuta mientras se ejecutan sus pruebas automatizadas. Al ejecutar un conjunto de pruebas y observar los datos de cobertura de código, existe una idea general de qué parte de la aplicación se está probando.

Hay varios tipos de cobertura de código. Para los sistemas integrados, debe estar familiarizado con la declaración, la rama y MC / DC. Para los requisitos más estrictos, como en software crítico para la seguridad, es posible que se requiera la verificación del código objeto o la cobertura del código en lenguaje ensamblador.

Recopile y analice métricas de cobertura de código

La recopilación y el análisis de métricas de cobertura de código es un aspecto importante del desarrollo de software integrado crítico para la seguridad. La cobertura de código mide la finalización de casos de prueba y pruebas ejecutadas. Proporciona evidencia de que la validación está completa, al menos según lo especificado por el diseño del software.

También demuestra la ausencia de comportamientos no deseados: el código que no está cubierto por ninguna prueba es un riesgo, ya que se desconocen su comportamiento y funcionalidad. La cantidad y el alcance de la cobertura del código depende del nivel de integridad de seguridad. Como era de esperar, cuanto mayor sea el nivel de integridad, mayor será el rigor utilizado e, inevitablemente, el número y la complejidad de los casos de prueba.

A continuación, se muestran ejemplos de tipos de cobertura de código recomendados.

  • Declaración de cobertura requiere que cada declaración de programa se ejecute al menos una vez (la cobertura de sucursales y MC / DC abarca la cobertura de declaraciones).
  • Cobertura de sucursales asegura que se ejecute cada rama de decisión posible (construcciones if-then-else).
  • Cobertura de decisión / condición modificada (MC / DC) requiere la cobertura de código más completa para garantizar que los casos de prueba ejecuten cada rama de decisión y todas las posibles combinaciones de entradas que afectan el resultado de la lógica de decisión. Para la lógica compleja, la cantidad de casos de prueba puede aumentar, por lo que las restricciones de condición modificadas se utilizan para limitar los casos de prueba a aquellos que dan como resultado el cambio de expresiones lógicas independientes. Mira esto tutorial de la NASA.

Las herramientas avanzadas de automatización de pruebas unitarias, como la prueba Parasoft C / ++, proporcionan todas estas métricas de cobertura de código y más. La prueba C / C ++ automatiza esta recopilación de datos en las pruebas de host y de destino y acumula el historial de cobertura de la prueba a lo largo del tiempo. Este historial de cobertura de código puede abarcar pruebas de unidad, integración y sistema para garantizar que la cobertura sea completa y rastreable en todos los niveles de prueba.

Aumente la cobertura del código con la creación de casos de prueba unitaria automatizada

La creación de pruebas unitarias productivas siempre ha sido un desafío. El cumplimiento de los estándares de seguridad funcional exige software de alta calidad, lo que impulsa la necesidad de conjuntos de pruebas que afecten y produzcan estadísticas de alta cobertura de código.

Los equipos requieren casos de prueba unitarios que les ayuden a alcanzar sus objetivos de cobertura, que son importantes incluso fuera del ámbito del software crítico para la seguridad. ¡Cualquier código que no esté cubierto por al menos una prueba se envía sin probar!

Aumentar la cobertura del código puede ser un desafío. Analizar ramas en el código y tratar de encontrar razones por las que ciertas secciones de código no están cubiertas, continúa robando ciclos a los equipos de desarrollo.

Cómo obtener una cobertura del código estructural del 100% de los sistemas críticos para la seguridad

Resolver brechas de cobertura

Los equipos pueden resolver las brechas de cobertura en los conjuntos de pruebas mediante un asesor de cobertura. Parasoft descubrió cómo utilizar el análisis de código estático avanzado (análisis de flujo de control y datos) para encontrar valores para los parámetros de entrada necesarios para ejecutar líneas específicas de código descubierto.

Este análisis calcula las condiciones previas para los parámetros de función, las variables globales y las llamadas a funciones externas necesarias para ejecutar una línea de código específica. El asesor de cobertura presenta una colección de soluciones para las líneas de código seleccionadas por el usuario. Los valores presentados se utilizan para crear nuevos casos de prueba unitaria. Esta funcionalidad aumenta la productividad de los desarrolladores que trabajan en casos de prueba unitaria para mejorar la cobertura del código.

Captura de pantalla de la prueba Parasoft C / C ++ que muestra la pestaña Coverage Advisor con las dependencias requeridas, las condiciones previas y la cobertura esperada.

Cada solución de cobertura incluye:

  • Dependencias requeridas. Dependencias que deben personalizarse para cubrir la línea seleccionada. Estos pueden incluir parámetros de función, llamadas a funciones externas, variables globales, variables locales y miembros de la clase.
  • Condiciones previas. Condiciones que deben cumplir las dependencias requeridas para cubrir la línea seleccionada. Al hacer clic en una condición previa, se navega a la línea de código relacionada.
  • Cobertura esperada. Líneas de código que se cubrirán si se cumplen todas las condiciones previas.

Optimice las pruebas con la ejecución inteligente de pruebas

Para acelerar las pruebas en una canalización continua, se necesita la ejecución inteligente de pruebas por compilación para reducir el conjunto de pruebas que deben ejecutarse para abordar el riesgo que ha introducido cada nueva iteración. Los análisis proporcionados por el análisis de impacto de las pruebas son clave para que las pruebas se centren solo en lo que es absolutamente necesario probar en lugar del enfoque de escopeta utilizado de otro modo.

Solo a través de la inteligencia, la toma de decisiones basada en datos puede permitir la realización de pruebas continuas. Centrar al equipo de desarrollo en el conjunto mínimo de pruebas para garantizar la cobertura adecuada en cada iteración es la clave para devolver la agilidad a los métodos de desarrollo ágiles.

Devuelva la agilidad al desarrollo ágil con pruebas basadas en cambios

La ejecución de pruebas inteligentes en la prueba Parasoft C / C ++ se amplía con complementos para sistemas CI (Jenkins, TeamCity, Bamboo, etc.) para una funcionalidad avanzada que ayude a las organizaciones de desarrollo de software a reducir los cuellos de botella asociados con la ejecución de compilaciones continuas. Las mismas capacidades están disponibles dentro de los entornos IDE con complementos dedicados que acceden a una imagen de cobertura centralizada a través de una API REST y determinan qué pruebas deben ejecutarse localmente dentro del IDE para verificar todo el código modificado.

En el lado del desarrollo, los desarrolladores experimentados pueden aplicar la estructura adecuada en la organización de sus pruebas y ejecutar solo un subconjunto de ellas manualmente, pero es posible que aún no sepan qué pruebas necesitan ejecución para verificar TODOS los cambios.

Los equipos que usan CI pueden confiar en las compilaciones nocturnas para ejecutar todas las pruebas automáticamente durante la noche y obtener comentarios al día siguiente, pero solo si es posible ejecutar la cantidad total de pruebas en menos de 12 horas.

Desafortunadamente, la mayoría de los equipos de desarrollo de software están ejecutando sus operaciones diarias aceptando esas prácticas de prueba no escalables. La situación se vuelve aún más difícil cuando se trata de pruebas manuales. Las organizaciones tradicionales de desarrollo de software todavía siguen las prácticas de prueba representadas por una pirámide invertida, que enfatiza la ejecución de pruebas manuales en lugar de pruebas automatizadas por una razón u otra.

Captura de pantalla de la prueba de Parasoft C / C ++ que muestra el gráfico circular de las pruebas afectadas por el cambio, que muestra cuatro partes desiguales en el gráfico circular: Pasa, No pasa, Incompleta, Reprueba.

La ejecución de prueba inteligente utiliza análisis de impacto de prueba para rastrear la ejecución de pruebas manuales en aplicaciones y la información de cobertura de código capturada asociada con esas pruebas. Se utiliza una tecnología similar para las pruebas automatizadas. Este análisis determina qué pruebas manuales deben ejecutarse para acceder a la funcionalidad modificada que se entrega con cada nueva compilación. Por lo tanto, la ejecución de pruebas inteligentes es fundamental a nivel de desarrollador y evaluador en sus IDE locales. Les permite enfocar las pruebas donde sea necesario, eliminando las conjeturas y el trabajo adicional "por si acaso".

Captura de pantalla de la prueba de Parasoft C / C ++ que muestra archivos de cambio afectado: cuatro columnas que muestran Pasa, Falla, Incompleta, Reprueba.

Resumen

La integración continua y la entrega continua son lugares comunes en el desarrollo integrado. La migración de un proceso en cascada a CI / CD y desarrollo ágil se traduce en reducción de riesgos y mejoras de calidad y seguridad. Sin embargo, las pruebas siguen siendo un obstáculo para la adopción del flujo de trabajo de CI / CD para sistemas integrados debido a los desafíos únicos en la automatización de las pruebas para ellos. Eliminar estos obstáculos con la ejecución inteligente de pruebas y optimizar las pruebas al tiempo que se mejora la cobertura del código es la clave para una adopción exitosa de CI / CD.

Texto blanco sobre fondo azul marino: Integración continua y entrega continua para sistemas integrados con un botón rojo debajo que dice Descargar documento técnico.

Escrito por

Ricardo Camacho

Ricardo, gerente sénior de marketing técnico de productos para las soluciones de pruebas integradas de Parasoft, tiene experiencia en SDLC y automatización de pruebas de aplicaciones integradas en tiempo real, de seguridad y críticas para la seguridad, y cumplimiento de software con los estándares de la industria.

Reciba las últimas noticias y recursos sobre pruebas de software en su bandeja de entrada.

Prueba Parasoft