Как получить 100% покрытие с помощью gcovr с кодом ifdef?

Мне нравится работать с gcovr на моем Linux-компьютере, чтобы понять, что проверено, а что нет. Я упал в яму, где не вижу решения.

У меня есть C-код, как показано чуть ниже (сохранить как main.c). Код сделан очень просто - и в действительности основное внимание уделяется только конструкции #if и тому, как работать с анализом покрытия для различных настроек компиляции.

/* Save as main.c */
#include <stdio.h>

void fct(int a)
{
// Define PRINTSTYLE to 0 or 1 when compiling
#if PRINTSTYLE==0
    if (a<0) {
        printf("%i is negative\n", a);
    } else {
        printf("%i is ... sorta not negative\n", a);
    }
#else
    if (a<0) {
        printf("%i<0\n", a);
    } else {
        printf("%i>=0\n", a);
    }
#endif
}


int main(void)
{
    fct(1);
    fct(-1);
    return 0;
}

Что я могу скомпилировать и провести тест покрытия в Linux, например,

$ rm -f testprogram *.html *.gc??
$ gcc -o testprogram main.c \
  -g --coverage -fprofile-arcs -ftest-coverage --coverage \
  -DPRINTSTYLE=0
$ ./testprogram
$ gcovr -r . --html --html-details -o index.html
$ firefox index.main.c.html

Это почти супер, но я хочу объединить результаты тестов для -DPRINTSTYLE=0 (см. Выше) и -DPRINTSTYLE=1 - тогда я, по логике, должен получить 100% покрытие в созданном index.main.c.html

Я полностью понимаю, что перекомпиляция нужна посередине.

Как мне получить 100% покрытие с помощью gcovr с кодом ifdef?


person Peter Toft    schedule 30.10.2019    source источник


Ответы (1)


Это выполнимо, но для этого требуется gcovr 4.2 (или более поздняя версия), как показано в https://gcovr.com/en/stable/guide.html#combining-tracefiles

Сначала установите или обновите gcovr, например с участием

pip install -U gcovr

Затем убедитесь, что ~ / .local / bin / находится в $ PATH.

Затем запустите gcovr один раз для каждой конфигурации и создайте отчет JSON:

gcc -o testprogram main.c -g --coverage -DPRINTSTYLE=0
./testprogram
gcovr -r . --json run-1.json

gcc -o testprogram main.c -g --coverage -DPRINTSTYLE=1
./testprogram
gcovr -r . --json run-2.json

Наконец, объедините отчеты JSON, используя режим -a / - add-tracefile, и создайте желаемый отчет:

gcovr --add-tracefile run-1.json --add-tracefile run-2.json --html-details coverage.html

Ссылка: https://github.com/gcovr/gcovr/issues/338

person Peter Toft    schedule 07.11.2019