Как правильно обрабатывать выходные каталоги для профилирования покрытия тестов GCC? - PullRequest
0 голосов
/ 24 октября 2018

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

Мы строим с использованием make-файлов и cs-make с cxxtestв качестве основы для модульного тестирования.Автоматически сгенерированный файл запуска теста - C ++, а все наши файлы приложений - на языке C.

Цель и модуль модульного теста для выполнения - это:

.SECONDEXPANSION:
UnitTest/%.exe: UnitTest/Tests/$$*/$$*Tests_cxx.cpp
    cs-rm *.gcda
    ..\cxxtest\bin\cxxtestgen --error-printer -o $@ $(addsuffix .h, $(basename $@))
    gcc -ftest-coverage -fprofile-arcs $(INCLUDES) $($*_SOURCES) -o $@
    ./$@
    gcovr -v

С $(INCLUDES) и $(SOURCES) в зависимости от ситуации.

Рецепт выполняется путем запуска (например)

cs-make cs-make -C TestPlatform -f UnitTest\makefile UnitTest\Test1.exe

Это создает Test1.exe и генерирует .gcno файлов.Test1.exe запускается и генерирует .gcda файлы.gcovr правильно интерпретирует эти файлы и выводит данные покрытия.

Пока все хорошо.Но мы фактически строим и запускаем несколько модульных тестов параллельно, выполняя:

cs-make -C TestPlatform -j -f UnitTest\makefile UnitTest\all

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

ToПоддерживая параллельные сборки, я добавил эту опцию к своему вызову GCC:

-fprofile-dir=UnitTest/Tests/$*/Coverage

, который помещает файлы .gcda для каждого исполняемого файла в отдельный каталог.

Но теперь gcovr не обрабатываетфайлы правильно:

gcovr -v
Filters for --root: (1)
- <_sre.SRE_Pattern object at 0x0000000004FED600>
Filters for --filter: (1)
- DirectoryPrefixFilter(C\:\/Workspace\/CoverageTest\/TestPlatform\/)
Filters for --exclude: (0)
Filters for --gcov-filter: (1)
- AlwaysMatchFilter()
Filters for --gcov-exclude: (0)
Filters for --exclude-directories: (0)
Scanning directory . for gcda/gcno files...
Found 6 files (and will process 4)
Pool started with 1 threads
Processing file: C:\Workspace\CoverageTest\TestPlatform\UnitTest\Tests\Test1\Coverage\coverage.gcda
Running gcov: 'gcov C:\Workspace\CoverageTest\TestPlatform\UnitTest\Tests\Test1\Coverage\coverage.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory C:\Workspace\CoverageTest\TestPlatform\UnitTest\Tests\Test1\Coverage' in 'c:\users\jfowkes\appdata\local\temp\tmpdfjja7'
Processing file: C:\Workspace\CoverageTest\TestPlatform\Test1Tests_cxx.gcda
Running gcov: 'gcov C:\Workspace\CoverageTest\TestPlatform\Test1Tests_cxx.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory C:\Workspace\CoverageTest\TestPlatform' in 'c:\users\jfowkes\appdata\local\temp\tmpdfjja7'
Processing file: C:\Workspace\CoverageTest\TestPlatform\coverage.gcda
Running gcov: 'gcov C:\Workspace\CoverageTest\TestPlatform\coverage.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory C:\Workspace\CoverageTest\TestPlatform' in 'c:\users\jfowkes\appdata\local\temp\tmpdfjja7'
Processing file: C:\Workspace\CoverageTest\TestPlatform\UnitTest\Tests\Test1\Coverage\Test1Tests_cxx.gcda
Running gcov: 'gcov C:\Workspace\CoverageTest\TestPlatform\UnitTest\Tests\Test1\Coverage\Test1Tests_cxx.gcda --branch-counts --branch-probabilities --preserve-paths --object-directory C:\Workspace\CoverageTest\TestPlatform\UnitTest\Tests\Test1\Coverage' in 'c:\users\jfowkes\appdata\local\temp\tmpdfjja7'
Gathered coveraged data for 0 files
------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
------------------------------------------------------------------------------
TOTAL                                          0       0    --%
------------------------------------------------------------------------------
cs-make: Leaving directory `C:/Workspace/CoverageTest/TestPlatform'

gcovr, кажется, находит файлы и передает их в gcov, но данные покрытия не появляются.

Я пробовал разные gcovr опций, но ни один из них не делает это лучше.

Я запускаю эту сборку на Windows 10 в Eclipse CDT - это требование для нас.На основании других ответов я подозреваю, что могут быть проблемы с путями и / или разделителями каталогов, но на самом деле я ни в чем не уверен в данный момент.

Мой вопрос: какие изменения мне нужныmake to makefile, чтобы я мог добавить эти данные покрытия в нашу сборку, которая продолжает поддерживать параллельные сборки?

Конечно, я могу реструктурировать наше модульное тестирование, чтобы получить makefile-per-unit-test-набор, но это существенная работа, и я хотел бы избежать этого, если это вообще возможно.

1 Ответ

0 голосов
/ 24 октября 2018

Проблема заключается в том, что gcovr / gcov необходимо сопоставить данные покрытия с исходными файлами для генерации отчета о покрытии, а использование -fprofile-dir затрудняет это.AFAIK gcovr в настоящее время не может правильно обработать это дело.Параметр Gcovr --object-directory не может помочь в этом случае.

Рассмотрим cd во временный каталог, в котором вы выполняете сборку.Примерно так, переход от

gcc --coverage test/source.c -o testfoo
./testfoo
gcovr

к

[[ -d build-foo ]] || mkdir build-foo
cd build-foo && gcc --coverage ../test/source.c -o testfoo
cd build-foo && ./testfoo
cd build-foo && gcovr -r ../test

К сожалению, это будет вариант вашего подхода «Makefile for test suite».

Другая альтернатива можетвыполнять параллельные тесты в других каталогах, а затем копировать данные покрытия по одному набору тестов обратно в каталог сборки.Для этого необходимо указать соответствующие пути для переменной среды GCOV_PREFIX.Это будет та же процедура, что и при использовании gcovr в среде кросс-компиляции, как объяснил gocarlos на трекере проблем gcovr: https://github.com/gcovr/gcovr/issues/259#issuecomment-406788661

...