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报告.
Cia*_*lsh 11
这个答案与 @rcomblen 的答案相同,但有点过时,所以我将分享我的解决方案。这就是我所做的:
\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)\ncmake/CodeCoverage.cmake
gcovr
。这一步至关重要,因为该线程上的其他答案不再适用于gcovr
我已有的版本:(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
模块:
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我过去常常在没有以下内容的情况下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文件的报告