有关使用CMK/CDash的gcov的详细指南?

Ral*_*ang 48 c++ testing code-coverage cmake cdash

我在我的项目中使用CMake并设置了一个用于连续/夜间构建的cdash服务器.一切运作良好,通过设置crontab,我们将每小时/每晚的构建/测试结果自动上传到我们的cdash服务器.

我的下一步是将测试覆盖率报告添加到构建中.我在http://www.cmake.org/Wiki/CTest:Coverage找到了这份文件,但坦率地说,它与实用指南相差甚远.

目前我已经添加了所需的标志(而不是-fprofile-arcs -ftest-coverage,我发现--coverage更好),编译过程生成.gcno文件.但后来我被卡住了.命令

make NightlyCoverage
Run Code Online (Sandbox Code Playgroud)

好像什么也没做.谁能告诉我接下来要做什么?我想要的结果是make NightlyCoverage,生成覆盖率报告并上传到cdash服务器.

rco*_*len 49

我一直在成功使用https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake.

只需遵循指南:添加文件到我的CMAKE_MODULE_PATH目录

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules)
if(CMAKE_COMPILER_IS_GNUCXX)
    include(CodeCoverage)
    setup_target_for_coverage(${PROJECT_NAME}_coverage ${PROJECT_TEST_NAME} coverage)
endif()
Run Code Online (Sandbox Code Playgroud)

在我的CMakeLists.txt.我还手动添加了gcov作为目标的依赖项:

if(CMAKE_COMPILER_IS_GNUCXX)
    target_link_libraries(${PROJECT_TEST_NAME} gcov)
endif()
Run Code Online (Sandbox Code Playgroud)

有了这个,我只需输入

make my_project_coverage
Run Code Online (Sandbox Code Playgroud)

我在coverage构建树的目录中获取了html报告.

  • 链接到gcov并不是必需的.无论如何,Gcc会自动执行此操作,并且它不适用于Clang,例如它应该链接到libprofile_rt (5认同)
  • @rcomblen会聚合所有测试的覆盖率结果吗?或者您是否需要为每个测试目标设置setup_target_for_coverage? (3认同)
  • 关于``setup_target_for_coverage``的行不正确; 它应该是``setup_target_for_coverage(NAME $ {PROJECT_NAME} ....``;(我已经编辑了答案,但它被拒绝了). (3认同)
  • 我将添加一个注释,我在OSX上使用clang,除了CodeCoverage.cmake中的警告,这个解决方案工作得很好. (2认同)

Cia*_*lsh 11

这个答案与 @rcomblen 的答案相同,但有点过时,所以我将分享我的解决方案。这就是我所做的:

\n
    \n
  1. 创建了一个玩具项目
  2. \n
\n
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ tree -L 2\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmake\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CodeCoverage.cmake\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 domath.cpp\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 domath.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testdomath.cpp\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 third_party\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 googletest\n
Run Code Online (Sandbox Code Playgroud)\n

在哪里

\n
// src/domath.h\n\n#ifndef COVERAGETEST_DOMATH_H\n#define COVERAGETEST_DOMATH_H\n\n\nclass domath {\n\npublic:\n    int add(int a, int b);\n};\n\n\n#endif //COVERAGETEST_DOMATH_H\n
Run Code Online (Sandbox Code Playgroud)\n

\n
// src/domath.cpp\n\n#include "domath.h"\n\nint domath::add(int a, int b) {\n    return a + b;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\n
// src/testdomath.cpp\n#include "gtest/gtest.h"\n#include "domath.h"\n\n\nTEST(DoMathTests, testAdd){\n    domath m;\n    int actual = m.add(4, 6);\n    ASSERT_EQ(10, actual);\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 下载googletest放到第三方目录下
  2. \n
  3. 将本线程中其他答案所分享的要点复制cmake/CodeCoverage.cmake
  4. \n
  5. 安装gcovr。这一步至关重要,因为该线程上的其他答案不再适用于gcovr我已有的版本:
  6. \n
\n
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ pip install gcovr\n(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ gcovr --version\ngcovr 4.2\n(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ which gcovr\n/home/ciaran/miniconda3/bin/gcovr\n
Run Code Online (Sandbox Code Playgroud)\n

注意,我们需要 cmake 脚本的输出gcovr。\n4) 编写一个 cmake 脚本来创建库、测试可执行文件并使用该CodeCoverage.cmake模块:

\n
cmake_minimum_required(VERSION 3.15)\nproject(CoverageTest)\n\nset(CMAKE_CXX_STANDARD 14)\n\n# setup googletest\nadd_subdirectory(third_party/googletest)\n\n# create our library\nadd_library(DoMath STATIC src/domath.h src/domath.cpp)\nadd_dependencies(DoMath gtest gtest_main)\n\n# create the test executable\nadd_executable(TestDoMath src/testdomath.cpp)\ntarget_include_directories(TestDoMath PRIVATE third_party/googletest/googletest)\ntarget_link_libraries(TestDoMath PRIVATE\n        DoMath gtest gtest_main)\nadd_dependencies(TestDoMath DoMath gtest gtest_main)\n\n# now for coverage bits\nset(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)\nif (CMAKE_COMPILER_IS_GNUCXX)\n    include(CodeCoverage)\n    append_coverage_compiler_flags()\n\n    # we need to turn off optimization for non-skewed coverage reports\n    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -O0")\n    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")\n\n    # optional excludes - None needed here\n    #    set(COVERAGE_EXCLUDES)\n\n    # importantly, set the path to the gcovr executable that you downladed\n    set(GCOVR_PATH "/home/ciaran/miniconda3/bin/gcovr")\n    # Works\n    setup_target_for_coverage_gcovr_xml(\n            NAME TestDoMathCoverageXml\n            EXECUTABLE TestDoMath\n            DEPENDENCIES TestDoMath DoMath\n    )\n    # Works\n    setup_target_for_coverage_gcovr_html(\n            NAME TestDoMathCoverageHtml\n            EXECUTABLE TestDoMath\n            DEPENDENCIES TestDoMath DoMath\n    )\n    # This one did not work for me:\n    setup_target_for_coverage_lcov(\n            NAME TestDoMathCoverageLcov\n            EXECUTABLE TestDoMath\n            DEPENDENCIES TestDoMath DoMath\n    )\nendif ()\n
Run Code Online (Sandbox Code Playgroud)\n

就是这样。现在只需构建新目标。

\n

祝你好运。

\n


yee*_*yee 7

我过去常常在没有以下内容的情况gcovr制作GCC 代码覆盖率报告CodeCoverage.cmake

$ cd /path/to/your/project
$ mkdir build && cd build && cmake ..
$ make && make test
$ gcovr -r ../ .
Run Code Online (Sandbox Code Playgroud)


小智 6

我按照以下方式设置了我的项目 'foo'。将https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake 中的 cmake 文件复制到子目录“cmake_modules”。在 CMakeLists.txt 文件中add_executable(foo ...)添加以下内容后:

if(CMAKE_COMPILER_IS_GNUCXX)
LIST(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
include(CodeCoverage)
APPEND_COVERAGE_COMPILER_FLAGS()
set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*') // this is optional if you want to exclude some directory from the report
SETUP_TARGET_FOR_COVERAGE_LCOV(NAME foo_coverage
                              EXECUTABLE foo
                              DEPENDENCIES foo)
endif()
Run Code Online (Sandbox Code Playgroud)

cmake之后,构建目标 make make foo_coverage 并打开build文件夹下foo_coverage文件夹中带有index.html文件的报告