1

我想在 cmake 的帮助下测试一个复杂的共享库(cxsc)。经过大量的试验和错误后,我设法创建了一个 html 覆盖率报告,但是我使用 boost 测试框架测试的行仍然是红色的。

这是我用来创建覆盖率报告的脚本:

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

这就是发生的事情:

  1. cmake -DCMAKE_BUILD_TYPE=Coverage ..build_coverage 目录被创建,其中包含一个target.dir目录和 *.gcno 文件
  2. cd tests && make测试可执行文件被创建并链接到目录中的共享库build_coverage也许这是我的错误
  3. make coverage收集覆盖数据并执行测试

编辑:

为了澄清我的问题,这里涵盖了一些行,但只有全局常量或一个经常使用的辅助函数。但不是我在测试中调用的函数/方法。

中的文件build_coverage/CMakeFiles/cxsc.dir/src/

  1. 之后cmake -DC...:一些 *.cmake 和 *.make 文件
  2. 在dir: *.gcno 文件make之后build_coverage
  3. 之后lcov -c -i ...:仍然是 *.gcno 文件
  4. 运行测试后:*.gcda 和 *.gcno 文件
  5. 之后lcov -c ...:目录中有很多移动,但文件名仍然相同
4

1 回答 1

0

我在您的 makefile 中没有看到任何 gcov 标志。试试这个 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")

看到这个帖子有类似的问题。

注意:“--coverage”可以替代“-fprofile-arcs -ftest-coverage”和“-lgcov”

于 2016-01-27T19:21:26.850 回答