Я хочу протестировать сложную разделяемую библиотеку (cxsc) с помощью cmake. После большого количества проб и ошибок мне удалось создать отчет о покрытии в формате html, но строки, которые я тестирую, с рамкой буст-тестирования, все еще остаются красными.
Это скрипт, который я использую для создания отчета о покрытии:
rm -fr build_coverage
mkdir build_coverage
cd build_coverage
cmake \
-DCMAKE_BUILD_TYPE=Coverage \
..
make
cd ../tests
make clean
make
cd ../build_coverage
make cxsc_coverage
Часть cmake, где создается отчет о покрытии:
# Cleanup lcov
COMMAND ${LCOV_PATH} --zerocounters --directory ${CMAKE_CURRENT_SOURCE_DIR}/build_coverage/CMakeFiles/cxsc.dir/src
COMMAND ${LCOV_PATH} --capture --initial --no-external --directory ${CMAKE_CURRENT_SOURCE_DIR}/build_coverage/CMakeFiles/cxsc.dir/src --output-file ${_outputname}.before
# Run tests
COMMAND LD_LIBRARY_PATH=${CMAKE_CURRENT_SOURCE_DIR}/build_coverage ${_testrunner} ${ARGV3}
# Capturing lcov counters and generating report
COMMAND ${LCOV_PATH} --capture --no-checksum --no-external --directory ${CMAKE_CURRENT_SOURCE_DIR}/build_coverage/CMakeFiles/cxsc.dir/src --output-file ${_outputname}.after
COMMAND ${LCOV_PATH} --add-tracefile ${_outputname}.before --add-tracefile ${_outputname}.after --output-file ${_outputname}.info
COMMAND ${GENHTML_PATH} -o ${_outputname} ${_outputname}.info
Makefile тестового бинарного файла (я думаю, что именно в этом и заключается ошибка):
g++ \
-o test_runner \
main.cpp \
test_interval.cpp \
-I./../src \
-I./../src/rts \
-I./../src/asm \
-I./../src/fi_lib \
-I./../build_coverage \
-L./../build_coverage \
-lcxsc \
-Wall -Winline \
-lboost_unit_test_framework
Вот что происходит:
cmake -DCMAKE_BUILD_TYPE=Coverage ..
каталог build_coverage создается с target.dir
каталог и * .gcno файлы в немcd tests && make
Испытательный исполняемый файл создан и связан с общей библиотекой в build_coverage
каталог (Может быть, здесь моя ошибка)make coverage
Данные покрытия собраны и тесты выполненыРедактировать:
Чтобы прояснить мою проблему, есть несколько покрытых строк, но только глобальные константы или одна вспомогательная функция, которая используется довольно часто. Но не те функции / методы, которые я вызываю в своих тестах.
Файлы в build_coverage/CMakeFiles/cxsc.dir/src/
:
cmake -DC...
: Несколько файлов * .cmake и * .makemake
в build_coverage
dir: * .gcno файлыlcov -c -i ...
: Все еще * .gcno файлыlcov -c ...
: Много движений в каталоге, но все те же имена файловЯ не вижу флагов gcov в вашем make-файле. Попробуйте это для test_runner:
g++ \
-Wall -Winline -fprofile-arcs -ftest-coverage \
main.cpp \
test_interval.cpp \
-I./../src \
-I./../src/rts \
-I./../src/asm \
-I./../src/fi_lib \
-I./../build_coverage \
-L./../build_coverage \
-lcxsc \
-lboost_unit_test_framework \
-lgcov \
-o test_runner
Вашей общей библиотеке тоже нужны эти флаги:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov")
Видеть это сообщение с похожей проблемой.
NB: «—coverage» может заменить «-fprofile-arcs -ftest-покрытие» и «-lgcov»
Других решений пока нет …