g++ - ¿Es posible combinar datos de cobertura de dos ejecutables con gcov/gcovr?
code-coverage (1)
En un proyecto, estoy ejecutando los casos de prueba en tres ejecutables diferentes, compilados con diferentes opciones. Dependiendo de las opciones, algunas rutas de código son tomadas o no. En este momento, solo estoy usando los datos de cobertura de un ejecutable.
Estoy usando gcovr para generar un XML que luego es analizado por Sonar:
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
Tengo tres conjuntos de archivos gcda y gcno, pero no sé cómo generar un informe global de ellos.
Hay alguna forma de hacer eso ?
Suponiendo que "compilado con diferentes opciones" quiere decir que compila de tal manera que obtiene diferentes salidas después del preprocesamiento, con la ayuda de lcov (como lo menciona k0n3ru) pude hacerlo. Aquí está el código de ejemplo en el archivo sut.c:
#include "sut.h"
#include <limits.h>
int foo(int a) {
#if defined(ADD)
a += 42;
#endif
#if defined(SUB)
a -= 42;
#endif
return a;
}
con sut.h solo proporciona la declaración de foo, y un simple main en test.c, que llama a foo e imprime los resultados. Luego, con esta secuencia de comandos pude crear un archivo total.info con una cobertura del 100% para sut.c:
> g++ --coverage -DADD test.c sut.c -o add.out
> ./add.out
> lcov -c -d . -o add.info # save data from .gdda/.gcno into add.info
> g++ --coverage -DSUB test.c sut.c -o sub.out
> ./sub.out
> lcov -c -d . -o sub.info # save again, this time into sub.info
> lcov -a add.info -a sub.info -o total.info # combine them into total.info
> genhtml total.info
Que luego para sut.c muestra los siguientes resultados:
EDITAR (Gracias a Gluttton por recordarme la adición de esta parte): Pasar del archivo total.info en formato lcov a la salida de Cobertura XML debería ser posible con la ayuda del "convertidor de lcov a cobertura XML" que se proporciona aquí (aunque no lo he intentado): https://github.com/eriwen/lcov-to-cobertura-xml
Sin embargo, el hecho de que la fusión de la información de cobertura sea posible no significa que sea una buena idea hacerlo: la cobertura, IMO, solo tiene un valor informativo limitado con respecto a la calidad de un conjunto de pruebas. La fusión de los resultados de cobertura de diferentes salidas del preprocesador reducirá aún más este valor.
Esto se debe a que las posibilidades de los desarrolladores de aprender sobre los escenarios que no han considerado se reducirán: al utilizar la compilación condicional, la estructura de control y el flujo de datos del código pueden variar enormemente entre los resultados del preprocesador: la información de cobertura que resulta de los resultados de "superposición" de la prueba las ejecuciones para diferentes salidas del preprocesador pueden hacer que una interpretación significativa de los resultados sea imposible.