Seminario web destacado: MISRA C++ 2023: todo lo que necesita saber | Vea ahora

Uso de la prueba Parasoft C / C ++ con CMake para pruebas unitarias

Foto de cabeza de Miroslaw Zielinski, director de gestión de productos de Parasoft
5 de mayo de 2020
6 min leer

¿Alguna vez se preguntó cómo puede usar Parasoft C/C++test con CMake para pruebas unitarias? Echa un vistazo a esta publicación para saber cómo.

El lanzamiento de C/C++test 2020.1 presenta la capacidad de integre la prueba C / C ++ con CMake para análisis estático y pruebas unitarias. Esta publicación se centra en cómo usar la prueba Parasoft C / C ++ con proyectos basados ​​en CMake para pruebas unitarias.

Las pruebas unitarias son más complicadas de integrar en el proceso de desarrollo que el análisis estático. Al final, se debe crear el archivo binario ejecutable. Esto es especialmente problemático para proyectos grandes y complejos que se componen de múltiples bibliotecas y ejecutables.

El archivo JSON de información de compilación, que usamos para el análisis estático, no es suficiente. No proporciona la información importante sobre la estructura del proyecto: qué archivos se incluyen en qué binarios y qué deben probarse juntos.

Integración de pruebas unitarias en proyectos basados ​​en CMake

Para permitir una fácil integración de las pruebas unitarias de prueba de Parasoft C / C ++ en proyectos basados ​​en CMake, la versión 2020.1 introduce una extensión de CMake, que permite definir objetivos de pruebas unitarias para la prueba C / C ++. Estos destinos generan automáticamente los archivos del proyecto de prueba C / C ++ que se pueden usar para crear, ejecutar y mantener pruebas unitarias.

La intención de esta extensión es permitir a los usuarios definir toda la infraestructura necesaria para las pruebas de unidades de prueba de Parasoft C / C ++ junto con sus objetivos habituales en los archivos de configuración de CMake.

Un ejemplo de pruebas unitarias en proyectos basados ​​en CMake

Veamos cómo funciona usando un ejemplo de prueba unitaria usando la herramienta C/C++test Professional – basada en Eclipse, que cuenta con una interfaz de usuario enriquecida. Descargue e instale la versión 2020.1, si aún no lo ha hecho.

Sigue estos pasos

En el directorio de instalación principal de C / C ++ test Professional, puede encontrar la extensión CMake con un ejemplo adjunto. Consulte el siguiente directorio: integración / cmake.

Para nuestros experimentos, recomiendo copiar la carpeta de integración / cmake de la instalación a su ubicación preferida. La estructura del ejemplo se muestra a continuación:

La carpeta de la aplicación contiene el destino "ejecutable". La carpeta de módulos con sus tres subcarpetas (mod1, mod2 y mod3) representa las bibliotecas estáticas que se utilizan para vincular con el ejecutable. Además, la carpeta cmake contiene la extensión de prueba C / C ++ para CMake. Es posible que desee copiar esta carpeta a su proyecto real para usar esta extensión.

Esta estructura simplificada pinta una imagen de los desafíos típicos que enfrentan los equipos que intentan implementar las pruebas unitarias: Cómo dividir todo el proyecto en partes probables, que representan grupos de archivos que lógicamente pertenecen juntos.

En la mayoría de los casos, los desarrolladores no querrán ejecutar pruebas unitarias contra un binario blob creado mediante la compilación de todos los archivos de un proyecto completo. Lo más probable es que los usuarios estén interesados ​​en agregar los casos de prueba para los mismos destinos binarios (ejecutables y bibliotecas) que han definido en el proyecto.

Cómo agregar casos de prueba para los mismos objetivos binarios definidos en el proyecto

Antes de discutir los detalles de la sintaxis de configuración, veamos cómo funciona usando el ejemplo proporcionado.

1. En el directorio de nivel superior donde se encuentra la carpeta de la aplicación, cree un directorio de compilación, cd en él y llame a una generación de scripts de compilación, como se muestra a continuación:

2. Una vez que CMake haya terminado con la generación de scripts de compilación (archivos MAKE), llame a make para compilar el proyecto de ejemplo:

3. Inicie C / C ++ test professional (el ejecutable cpptest en la carpeta de instalación). Seleccione un espacio de trabajo vacío, use “Menú Archivo -> Importar… -> Proyectos existentes en el espacio de trabajo” y seleccione “directorio raíz” para que sea la carpeta principal donde copió el ejemplo. El asistente escaneará de forma recursiva la carpeta seleccionada y encontrará todos los proyectos que se generaron automáticamente. Si ve algo como a continuación, puede hacer clic en "Finalizar".

Eclipse importará todos los proyectos y tendrá un nuevo espacio de trabajo listo para las pruebas unitarias. No tiene que hacer nada más para comenzar a agregar y ejecutar los casos de prueba y trabajar para mejorar la cobertura de su código.

4. En el navegador de proyectos, seleccione los tres proyectos, haga clic con el botón derecho y utilice la configuración de prueba “Parasoft -> Test Using -> Builtin -> Unit Testing -> Generate Unit Tests” para generar automáticamente los casos de prueba. Una vez generadas las pruebas, ejecute la configuración "Ejecutar pruebas unitarias" desde la misma ubicación.

Con estos simples cuatro pasos, preparó la infraestructura del proyecto para las pruebas unitarias. El equipo ahora está listo para comenzar a procesar los casos de prueba.

¿Cómo Funciona?

Además de los objetivos de compilación habituales, los archivos CMakeLists.txt contienen objetivos de pruebas unitarias. Al generar los scripts de compilación con cmake, los archivos de proyecto de prueba de C / C ++ también se generan automáticamente. Más adelante, durante el proceso de compilación, se generan automáticamente archivos de datos de compilación adicionales, que son necesarios para los proyectos de prueba de C / C ++.

Todo lo que se necesita para definir la estructura de los proyectos de pruebas unitarias se guarda dentro de los archivos CMakeLists.txt. El equipo no necesita mantener ningún archivo de configuración adicional. Todo es lindo y limpio. El proyecto se puede verificar, construir scripts y proyectos de prueba C / C ++, se pueden agregar y registrar pruebas junto con el código fuente, y se pueden realizar pruebas completas en el CI.

Una Mirada más Cercana

Echemos un vistazo más de cerca a la extensión CMake de prueba de C / C ++ y cómo ayuda a definir la infraestructura de los proyectos de prueba. Abra el archivo modules / mod1 / CMakeLists.txt. Debería ver algo como a continuación:

En las primeras seis líneas, puede ver la definición de destino normal. Aquí estamos definiendo un destino de biblioteca simple, con un archivo fuente mod1.cpp y un directorio de archivos de inclusión. Esto es lo que normalmente verá en sus proyectos de CMake.

En la línea 11, sin embargo, tenemos una nueva función CMake que se proporciona con la extensión de prueba C / C ++. Esta función le permite definir el objetivo de la prueba unitaria, que genera todos los archivos de proyecto de prueba C / C ++ requeridos. Puede encontrar la descripción completa de esta función en integrations / cmake / README.md. En este ejemplo específico, se hace lo siguiente:

  • Línea 11: El nombre del objetivo está definido. De forma predeterminada, se utilizará como nombre del proyecto de eclipse.
  • Línea 12: La configuración del compilador se especifica para que la prueba C / C ++ pueda analizar e instrumentar el código.
  • Línea 13: Se agregan los archivos de origen, que deben incluirse en el objetivo de la prueba unitaria.
  • Línea 14: La ubicación de los archivos de inclusión específicos del destino se agrega al destino de la prueba unitaria. Esto es lo mismo que hace con sus objetivos habituales.

Esta simple definición de destino es suficiente para generar un proyecto de prueba unitaria para la prueba Parasoft C / C ++. Los archivos de proyecto se generarán en la ubicación del archivo CMakeLists.txt, que probablemente sea el más conveniente. Si lo prefiere, puede generar los archivos del proyecto fuera del árbol de origen y evitar problemas de fusión. Esto se muestra en app / CMakeLists.txt:

  • Línea 11: El nombre del objetivo está definido. De forma predeterminada, se utilizará como nombre del proyecto de eclipse.
  • Líneas 12, 13: Se especifica la ubicación del proyecto de prueba C / C ++. Aquí estamos creando el proyecto fuera del árbol de origen.
  • Líneas 14, 15: Se crea una carpeta vinculada a eclipse. Debe especificar el nombre de la carpeta y la ubicación que se vinculará.
  • Línea 16, 17: Se agregan los archivos de origen, que deben incluirse en el objetivo de la prueba unitaria.
  • Línea 19: Se agregan tres bibliotecas para el objetivo de prueba unitaria. La prueba C / C ++ utilizará esas bibliotecas al compilar el ejecutable de prueba.

Para obtener más detalles, revise los siguientes archivos de la / integrations / cmake directorio:

  • LÉAME.mc
  • app / CMakeLists.txt
  • módulos / mod1 / CMakeLists.txt
  • pruebas / cpptest_modules / CMakeLists.txt

Resumen

Estos son los puntos importantes sobre la extensión.

  • La extensión CMake se puede encontrar en la instalación de C / C ++ test Professional en el siguiente directorio: / integraciones / cmake / cmake. Es posible que deba copiarlo en la estructura de su proyecto.
  • Para habilitar CMake con la función de extensión relacionada con la prueba de C / C ++, deberá incluir la extensión en su estructura de archivo CMakeLists.txt usando un comando como el siguiente:
    • Incluir (cmake / cpptest.cmake)
    • Vea el ejemplo en integration / cmake / CMakeLists.txt.
  • Puede definir sus objetivos de prueba unitaria (qué efectos en los proyectos de prueba C / C ++) de la forma que desee. Puede agregar un proyecto de prueba unitaria para sus ejecutables, bibliotecas, combinación de bibliotecas o cualquier colección arbitraria de archivos.
  • Debe asegurarse de que todas las bibliotecas y archivos de encabezado necesarios estén incluidos en la definición de destino. Aquí se aplican las reglas habituales de CMake. Si se incluye, la biblioteca u opción se estableció a nivel global. Luego se incluirá en su objetivo de prueba unitaria. Si tiene alguna configuración específica de destino, deberá agregarla.
  • Si está agregando el objetivo de prueba unitaria para el objetivo binario existente (como una biblioteca o un ejecutable), el procedimiento recomendado es replicar todas las configuraciones realizadas para el objetivo original. Nota: Puede agregar destinos completos a la función cpptest_add_executable, que copiará todos los archivos de origen en el nuevo destino.
  • Si no le importa que se creen archivos de proyecto de prueba de C / C ++ en sus directorios de archivos de origen, esta es la configuración más simple y recomendada. Si desea que los archivos del proyecto se coloquen en algún lugar fuera de su árbol de origen, puede hacerlo fácilmente.
  • No es necesario registrar los archivos de proyecto de prueba de C / C ++ generados (.project y .parasoft). Se volverán a crear para cada nueva construcción. Sin embargo, debe verificar todos los casos de prueba y códigos auxiliares.
Aprenda a usar Parasoft C/C++test con proyectos basados ​​en CMake para pruebas unitarias.