Logotipo de Parasoft Buscar

¡Descubre GoogleTest, con certificación TÜV y la tecnología Agentic AI para pruebas de C/C++!
Obtenga los detalles »

Fondo geométrico con toques de azul y verde.
Imagen de portada del documento técnico: El valor de usar una solución unificada de pruebas de C/C++

White Paper

El valor de usar una solución de prueba unificada de C/C++

Antes de comenzar, vea una vista previa a continuación.

Resumen

Los esfuerzos de verificación y validación de software dependen de los objetivos de seguridad funcional, los niveles de riesgo empresarial y la cultura de calidad de la organización. Producir software seguro, confiable y de alta calidad requiere más que determinación: exige conocimientos sólidos y la combinación adecuada de técnicas y herramientas de prueba.

Este documento explica cómo los equipos de desarrollo pueden mejorar el aseguramiento de la calidad combinando técnicas de pruebas automatizadas, entre las que se incluyen:

Los conceptos analizados se aplican a cualquier lenguaje de programación, con ejemplos del desarrollo en C/C++ utilizando Parasoft C / C ++test.

No existe una solución mágica.

Al considerar posibles fallos de software de alto nivel, se pueden distinguir varias clases de errores de software:

  • Errores resultantes de requisitos faltantes
  • Errores causados ​​por requisitos especificados incorrectamente
  • Errores que se producen porque los requisitos se han codificado incorrectamente.

Las dos primeras categorías se enmarcan dentro de la gestión de requisitos. Este artículo se centra en la tercera categoría, que abarca una amplia gama de posibles problemas de software.

¿Qué significa "un requisito se ha codificado incorrectamente"? Puede significar varias cosas.

Consideremos un módulo de software diseñado para procesar dos mil muestras por segundo.

  • El resultado puede ser perfectamente correcto en cuanto a los valores, pero inválido porque la respuesta no se proporcionó dentro del plazo requerido.
  • El algoritmo puede calcular incorrectamente el número de muestras en el búfer leyendo valores aleatorios de fuera del mismo.
  • O bien, el estado inicial de las variables puede no estar configurado correctamente, lo que da lugar a errores transitorios.
  • Por último, la lógica en los puntos de bifurcación puede estar codificada incorrectamente, lo que da como resultado código muerto que nunca se ejecutará.

Ninguna tecnología por sí sola erradica eficazmente todos los tipos de errores. La memoria no inicializada se puede detectar mediante análisis estático basado en patrones, mientras que la detección de desbordamiento de búfer requiere análisis estático avanzado basado en flujo o monitoreo de memoria en tiempo de ejecución. El código que nunca se ejecuta se puede identificar mediante análisis de cobertura de códigoLos requisitos de bajo nivel deben tener pruebas unitarias correspondientes, incluidas comprobaciones de rendimiento y enlaces de trazabilidad a los requisitos que verifican y validan.

No todos los proyectos de software necesitan todas las tecnologías de prueba disponibles, y las organizaciones se enfrentan al dilema de cómo equilibrar el presupuesto y la calidad. Los proyectos relacionados con la seguridad funcional probablemente seleccionarán todas las tecnologías disponibles para garantizar una calidad sin compromisos y el cumplimiento de los estándares de seguridad del software, como ISO 26262,, DO-178C, o IEC 62304.

Los equipos suelen optar por el análisis estático, las pruebas unitarias, las pruebas de integración, las pruebas de sistema y la cobertura de código, ya que parecen abarcar una parte significativa de los defectos de software. En cualquier caso, los equipos que diseñan procesos de aseguramiento de la calidad deben conocer el panorama actual y comprender las consecuencias de seleccionar un subconjunto específico de las tecnologías de prueba disponibles.

La reticencia a implementar una amplia gama de tecnologías de prueba suele deberse a la preocupación de que el uso de múltiples técnicas suponga una carga de trabajo significativa en el ritmo de desarrollo y afecte al presupuesto.

El coste de utilizar varias herramientas independientes, la curva de aprendizaje y la necesidad de alternar entre diferentes modelos de uso e interfaces pueden resultar problemáticos. En consecuencia, los desarrolladores tienden a evitar el uso de herramientas y la automatización, ya que esto desvía su atención de la escritura de código al uso de herramientas, disminuyendo así su productividad.

Panorama de los defectos de software y las estrategias de detección.
Panorama de los defectos de software y las estrategias de detección.

El valor de contar con una herramienta de prueba unificada

Es importante especificar las expectativas de una herramienta de pruebas unificada antes de analizar su valor. La herramienta debería:

  • Admite múltiples tecnologías de prueba
  • Sea fácil de usar
  • Detectar errores, vulnerabilidades y regresiones.
  • Proporcionar trazabilidad desde los requisitos hasta las pruebas.
  • Mida la complejidad, portabilidad y capacidad de mantenimiento del código.
  • Eduque a los desarrolladores proporcionando comentarios instantáneos mientras escriben el código
  • Proporcionar información sobre el progreso del desarrollo.
  • Combinar resultados de diferentes técnicas para análisis avanzados
  • Reducir el tiempo de comercialización, por ejemplo, mediante IA con agentes.

Las pruebas unificadas ayudan a evitar una serie de problemas, entre ellos:

  • Múltiples curvas de aprendizaje
  • Integración de herramientas desbrozadas con diferentes interfaces
  • Impedir el intercambio de información entre diferentes elementos de una cadena de herramientas.

Detectar tantos defectos como sea posible

Como se mencionó en la introducción, los defectos de software se clasifican en diferentes categorías, por lo que no se puede esperar que una sola técnica de prueba los identifique todos. Para ilustrarlo con un ejemplo más concreto, observe el siguiente fragmento de código:

Código fuente de ejemplo.

Código fuente de ejemplo.

Estas pocas líneas de código presentan varios problemas. En concreto, en la línea 13, el desarrollador intenta inicializar un búfer global utilizando el valor del índice calculado en la función calculateIdx(), pero no verifica si este se encuentra dentro del rango permitido. Incluso tras realizar docenas de pruebas manuales, es posible que este problema no se detecte, ya que escribir un valor entero en una ubicación de memoria aleatoria rara vez produce un efecto inmediato y espectacular.

Pero un día, muy probablemente después del lanzamiento, la distribución de la memoria podría cambiar y la operación de la línea 13 provocaría el fallo de la aplicación. Curiosamente, el análisis estático también podría no detectar este problema debido al bucle que se utiliza para calcular el índice.

En cambio, una herramienta de monitorización de memoria, que instrumenta el código fuente inyectando comprobaciones especiales e informa sobre operaciones de memoria incorrectas, detecta problemas de software únicamente en las rutas ejecutadas. Este enfoque no se basa en suposiciones, lo que supone una gran ventaja frente al análisis estático, ya que la precisión de los problemas detectados es muy alta. En este ejemplo, la detección de errores de memoria de Parasoft identificó el problema fácilmente.

Detección de problemas funcionales y regresiones

Detectar discrepancias entre los resultados esperados y los reales requiere comparar los resultados con especificaciones predefinidas. Si bien el núcleo análisis estático y dinámico Las herramientas se centran en defectos como errores de memoria o fallos de seguridad, mientras que la validación de la corrección funcional suele basarse en un conjunto diferente de prácticas. Los métodos más populares incluyen las pruebas manuales del sistema, las pruebas de integración y las pruebas unitarias.

Prueba unitariaLa creación de casos de prueba con aserciones de verificación, que requiere esfuerzo por parte de los desarrolladores, es un método fundamental para detectar regresiones funcionales. (Los fundamentos técnicos de las pruebas unitarias no se abordan aquí). Este documento se centra en cómo una herramienta de prueba unificada puede mejorar el proceso de pruebas unitarias para aumentar la productividad y la eficiencia sin obstaculizar el trabajo de los desarrolladores.

Existen muchas áreas donde una herramienta de prueba unificada puede facilitar el proceso de pruebas unitarias. La lista de beneficios incluye:

  • Incrementar la productividad de los desarrolladores al crear casos de prueba, por ejemplo, proporcionando asistentes gráficos para crear, editar y configurar casos de prueba.
  • Integración con frameworks de simulación/maquetación, lo que permite simular y crear simulaciones fácilmente para recrear escenarios de prueba complejos, sin necesidad de utilizar grandes bases de código.
  • Correlacionar los casos de prueba con los informes de cobertura de código para evaluar la exhaustividad de las pruebas.
  • Optimización de las sesiones de prueba mediante el cálculo automático del conjunto mínimo de casos de prueba necesarios para verificar el delta del código.
  • Combinar informes de cobertura de código de otras técnicas de prueba, como pruebas manuales/a nivel de sistema o pruebas de integración para identificar código no probado.
  • Rastrear los resultados hasta los requisitos para comprender mejor el impacto de las pruebas fallidas.

La creación de pruebas con asistentes o editores gráficos puede aumentar la productividad de toda una organización al involucrar a los equipos de control de calidad en el proceso de escritura de pruebas unitarias, lo que les permite contribuir activamente al desarrollo. Para los miembros del equipo de control de calidad, es más sencillo usar asistentes gráficos que escribir el código de prueba adecuado en editores de código, ya que configurar valores mediante formularios no requiere conocimientos avanzados de programación y ahorra tiempo, especialmente si los miembros del equipo carecen de experiencia. Sin embargo, Parasoft ha evolucionado e integrado un servidor MCP y agentes de IA para realizar pruebas de forma autónoma.

Trazabilidad de requisitos

Los informes de cobertura de las pruebas unitarias y de sistema proporcionan datos valiosos, especialmente cuando se combinan. Sin embargo, sin trazabilidad a los requisitos, los equipos carecen del contexto necesario para responder preguntas críticas, como:

  • ¿Se han implementado todos los requisitos?
  • ¿Se cumplen todos los requisitos de bajo nivel?
  • ¿Qué ocurre con el 2% de las pruebas que fallaron?
  • ¿Cuál es su impacto en la calidad general del sistema?
  • ¿Están bloqueando el lanzamiento?
  • ¿Quizás solo afectan a funcionalidades obsoletas, sin repercusión en casos de uso importantes?

Echando un vistazo a un informe de trazabilidad de pruebas a requisitos Responde a todas estas preguntas.

La capacidad de correlacionar los requisitos con los resultados de diferentes tipos de pruebas es una gran ventaja de usar una herramienta de pruebas unificada. Los resultados de las pruebas unitarias, de sistema y de integración, así como los estándares de codificación y las métricas de código, pueden correlacionarse para proporcionar información sobre el estado de los requisitos críticos y no críticos.

Evaluación de la complejidad, la portabilidad y el mantenimiento del código.

La comprobación exhaustiva de todos los requisitos y una cobertura de código casi completa son un claro indicio de que el proyecto avanza correctamente. Sin embargo, estos datos no proporcionan información sobre el coste futuro de completar, desplegar y mantener el producto final.

  • ¿La velocidad se mantendrá igual hasta el final del proyecto?
  • ¿Cuál será el coste del mantenimiento del código?
  • ¿Y el coste de una posible refactorización del código?

Es casi imposible responder a estas preguntas sin recurrir a métricas de código, como la complejidad ciclomática, la profundidad media de herencia, el número medio de parámetros de función y, sobre todo, la cantidad de código duplicado. Todas estas métricas proporcionan información valiosa que ayuda a los gestores de proyectos a estimar el estado del código del proyecto y los costes futuros relacionados con su mantenimiento y modificaciones.

Gráfico analítico abstracto

Capacitación de desarrolladores mediante retroalimentación instantánea.

Mantener las métricas del código dentro del rango óptimo y prevenir el código de riesgo no se logra por sí solo. Los desarrolladores necesitan retroalimentación sobre el código que escriben, y cuanto antes la reciban, más cerca estará del momento de su desarrollo y de la posibilidad de realizar modificaciones. De esta manera, la retroalimentación instantánea reduce los costos de las mejoras del código, mientras que retrasarla hasta las compilaciones nocturnas o incluso hasta las sesiones de integración continua incrementa dichos costos.

La solución ideal integra el cumplimiento de los estándares de codificación directamente en el IDE del desarrollador, proporcionando retroalimentación interactiva a medida que se escribe el código. Una herramienta de prueba unificada debería ofrecer esta funcionalidad, siendo lo suficientemente flexible para que los equipos seleccionen las directrices de codificación que prefieran e implementen las extensiones necesarias del IDE. En definitiva, la forma más eficaz de evitar que reaparezcan las estructuras de código problemáticas es aplicar automáticamente las directrices de codificación, permitiendo a los desarrolladores aprender y adaptarse en tiempo real.

Análisis avanzado y análisis del impacto de las pruebas

Los datos obtenidos de las diversas técnicas de prueba utilizadas en un proyecto, al combinarse, ofrecen un gran potencial para inferir métricas de segundo nivel y realizar análisis avanzados. Una herramienta de prueba unificada permite a los equipos analizar el código desde una perspectiva completamente nueva. Un caso de prueba unitaria fallido tiene un significado diferente para un desarrollador, dependiendo de si se produce en código clasificado como de alto o bajo riesgo según el análisis de métricas de código. Si esta información se combina con estadísticas del control de versiones y se correlaciona con los requisitos, los equipos pueden tomar mejores decisiones sobre cuándo y cómo corregir el código.

Otro tipo de análisis que ofrece una herramienta de pruebas unificada es el análisis del impacto de las pruebas, y tiene un gran potencial para mejorar la productividad del equipo. capacidad de análisis de impacto de pruebas Una herramienta de pruebas unificada busca comprender la relación entre el código fuente, los casos de prueba y los resultados de la cobertura de código para calcular el conjunto óptimo de casos de prueba para la verificación y validación de cambios específicos en el código. De esta manera, los equipos pueden limitar sus sesiones de pruebas ejecutando solo un pequeño subconjunto de pruebas en lugar de suites de regresión completas. Este enfoque en probar únicamente lo estrictamente necesario se traduce en ahorros significativos para cualquier tipo de proyecto, ya sea mediano o grande.

Integración de todas las herramientas: Parasoft C/C++test con un centro centralizado de informes y análisis.

Parasoft C/C++test es una solución de pruebas unificada y totalmente integrada para proyectos de desarrollo de software en C/C++. Está disponible como complemento para entornos de desarrollo integrados (IDE) populares, como Eclipse, VS Code y Visual Studio. Su estrecha integración con el IDE evita los problemas mencionados anteriormente.

Los desarrolladores pueden realizar comprobaciones de cumplimiento de estándares de codificación o ejecutar pruebas unitarias al instante mientras escriben el código. Los miembros del equipo de control de calidad pueden realizar pruebas manuales mientras se supervisa la aplicación para comprobar la cobertura del código y detectar errores en tiempo de ejecución. Se pueden realizar análisis sin conexión, como análisis de flujo, durante la fase de integración continua. Las sesiones del servidor, con una interfaz de línea de comandos intuitiva, envían los resultados del análisis al panel centralizado de informes y análisis, que muestra información agregada del entorno de desarrollo.

Las amplias capacidades de generación de informes de Parasoft, que incluyen la integración de datos de herramientas de terceros, el envío de resultados de pruebas a los entornos de desarrollo integrados (IDE) de los programadores y el cálculo de análisis avanzados, permiten a los usuarios identificar las acciones necesarias en el momento preciso. La retroalimentación continua en cada fase del flujo de trabajo acelera el desarrollo ágil y reduce el costo de cumplir con los estándares de seguridad.

El enfoque de los procesos y la arquitectura de aseguramiento de la calidad que se analiza en este documento no se limita únicamente a proyectos de C/C++. Parasoft ofrece soluciones similares para Java, C# y VB.NET.

Equipo de desarrolladores

¿Listo para sumergirte más profundamente?

Obtenga el documento técnico completo