Можно ли объединить данные покрытия из двух исполняемых файлов с помощью gcov/gcovr?

В одном проекте я запускаю тестовые примеры на трех разных исполняемых файлах, скомпилированных с различными параметрами. В зависимости от параметров используются некоторые коды кода или нет. Прямо сейчас, я использую только данные покрытия из одного исполняемого файла.

Я использую gcovr для генерации XML, который затем обрабатывается Sonar:

gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml

У меня есть три набора файлов gcda и gcno, но я не знаю, как создать глобальный отчет о них.

Есть ли способ сделать это?

Ответы

Ответ 1

Предполагая, что с помощью "скомпилированных с различными параметрами" вы имеете в виду, что вы компилируете такие, что вы получаете разные результаты после предварительной обработки, с помощью lcov (как упоминалось k0n3ru) я смог это сделать. Здесь пример кода в файле 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;
}

когда sut.h содержит только объявление foo и простой основной в test.c, который вызывает foo и выводит результаты. Затем, с этой последовательностью команд, я смог создать файл total.info со 100% покрытием для 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

Что тогда для sut.c показывает следующие результаты:

введите описание изображения здесь

EDIT (спасибо Gluttton за напоминание мне о добавлении этой части): переход от файла total.info в формате lcov к XML-выводу Cobertura должен быть возможен с помощью "конвертера XML lcov to cobertura", приведенного здесь (хотя я этого не пробовал): https://github.com/eriwen/lcov-to-cobertura-xml

Однако факт возможного объединения информации о покрытии, безусловно, не означает, что это хорошая идея: Coverage, IMO, имеет лишь ограниченную информационную ценность в отношении качества тестового набора. Слияние результатов покрытия с разных выходов препроцессора еще больше уменьшит это значение.

Это связано с тем, что возможности для разработчиков, чтобы узнать о сценариях, которые они не рассмотрели, будут уменьшены: используя условную компиляцию, структура управления и поток данных кода могут сильно варьироваться между выводами препроцессора - информацией о покрытии, которая возникает в результате "наложения", результаты тестовых прогонов для разных выходов препроцессора могут сделать значимую интерпретацию результатов невозможными.