Я пытаюсь сгенерировать данные покрытия для своих модульных тестов, с конечной целью отображения этих данных как части нашего автоматизированного вывода сборки.
Мы строим с использованием 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-набор, но это существенная работа, и я хотел бы избежать этого, если это вообще возможно.