C++ 与CMake/CDash一起使用gcov的详细指南?
我正在将CMake用于我的项目,并为连续/夜间构建设置cdash服务器。一切都很好,通过设置crontab,我们可以将每小时/每夜的构建/测试结果自动上传到我们的cdash服务器 我的下一步是将测试覆盖率报告添加到构建中。我在这里找到了这份文件,但坦率地说,它离实用指南有点远 目前,我已经添加了必需的标志(我发现编译过程生成.gcno文件的效果更好,而不是C++ 与CMake/CDash一起使用gcov的详细指南?,c++,testing,cmake,code-coverage,cdash,C++,Testing,Cmake,Code Coverage,Cdash,我正在将CMake用于我的项目,并为连续/夜间构建设置cdash服务器。一切都很好,通过设置crontab,我们可以将每小时/每夜的构建/测试结果自动上传到我们的cdash服务器 我的下一步是将测试覆盖率报告添加到构建中。我在这里找到了这份文件,但坦率地说,它离实用指南有点远 目前,我已经添加了必需的标志(我发现编译过程生成.gcno文件的效果更好,而不是-fprofile arcs-ftest coverage)。但是我被卡住了。命令 make NightlyCoverage 似乎什么都没做
-fprofile arcs-ftest coverage
)。但是我被卡住了。命令
make NightlyCoverage
似乎什么都没做。谁能告诉我下一步该怎么办?我想要的结果是,通过执行makenightlycoverage
,生成覆盖率报告并上传到cdash服务器。我已经成功使用了
只需遵循指导原则:将文件添加到我的CMAKE\u模块路径
目录,添加
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()
在myCMakeLists.txt
中。我还手动添加了gcov
作为我的目标的依赖项:
if(CMAKE_COMPILER_IS_GNUCXX)
target_link_libraries(${PROJECT_TEST_NAME} gcov)
endif()
用这个,我只是打字
make my_project_coverage
我在构建树的
coverage
目录中获取html报告。我使用gcovr
生成GCC代码覆盖率报告,而不使用CodeCoverage.cmake
:
$ cd /path/to/your/project
$ mkdir build && cd build && cmake ..
$ make && make test
$ gcovr -r ../ .
我用以下方式设置我的项目“foo”。将cmake文件从复制到子目录“cmake_modules”。在CMakeLists.txt文件中,在添加可执行文件(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()
完成cmake后,构建目标
制作
做福ê保险
然后在build文件夹的foo_coverage文件夹中打开带有index.html文件的报告此答案与@rcomblen的答案相同,但有点过时,因此我将分享我的解决方案。以下是我所做的:
cmake/CodeCoverage.cmake
gcovr
。这一步至关重要,因为此线程上的其他答案不再适用于我已有的gcovr
版本:gcovr
。
4) 编写一个cmake脚本,创建一个库,一个测试可执行文件,并使用CodeCoverage.cmake
模块:
cmake_minimum_required(VERSION 3.15)
project(CoverageTest)
set(CMAKE_CXX_STANDARD 14)
# setup googletest
add_subdirectory(third_party/googletest)
# create our library
add_library(DoMath STATIC src/domath.h src/domath.cpp)
add_dependencies(DoMath gtest gtest_main)
# create the test executable
add_executable(TestDoMath src/testdomath.cpp)
target_include_directories(TestDoMath PRIVATE third_party/googletest/googletest)
target_link_libraries(TestDoMath PRIVATE
DoMath gtest gtest_main)
add_dependencies(TestDoMath DoMath gtest gtest_main)
# now for coverage bits
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
if (CMAKE_COMPILER_IS_GNUCXX)
include(CodeCoverage)
append_coverage_compiler_flags()
# we need to turn off optimization for non-skewed coverage reports
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")
# optional excludes - None needed here
# set(COVERAGE_EXCLUDES)
# importantly, set the path to the gcovr executable that you downladed
set(GCOVR_PATH "/home/ciaran/miniconda3/bin/gcovr")
# Works
setup_target_for_coverage_gcovr_xml(
NAME TestDoMathCoverageXml
EXECUTABLE TestDoMath
DEPENDENCIES TestDoMath DoMath
)
# Works
setup_target_for_coverage_gcovr_html(
NAME TestDoMathCoverageHtml
EXECUTABLE TestDoMath
DEPENDENCIES TestDoMath DoMath
)
# This one did not work for me:
setup_target_for_coverage_lcov(
NAME TestDoMathCoverageLcov
EXECUTABLE TestDoMath
DEPENDENCIES TestDoMath DoMath
)
endif ()
就这样。现在只需建立新的目标
祝你好运。没有必要链接到gcov。Gcc会自动执行此操作,但它不会与Clang一起工作。例如,Clang应该链接到一个int libprofile_rtI会添加一条说明,我在OSX上使用Clang,除了CodeCoverage.cmake中的一条警告外,此解决方案工作得非常好。@rcomblen会为所有测试聚合覆盖率结果吗?或者您需要为每个测试目标的覆盖率设置\u target\u吗?可以使用这种方法排除目录吗?我在工具本身中看不到任何选项。关于覆盖范围的
setup\u target\u的行不正确;它应该是setup\u target\u for\u coverage(NAME${PROJECT\u NAME}…
;(我编辑了答案,但被拒绝)。我知道这在文档中,但是我发现它非常方便。gcovr-r。--html--html详细信息-o示例html详细信息。html
我一直通过-r.
失败,直到我发现您的命令是-r…
!
// src/domath.h
#ifndef COVERAGETEST_DOMATH_H
#define COVERAGETEST_DOMATH_H
class domath {
public:
int add(int a, int b);
};
#endif //COVERAGETEST_DOMATH_H
// src/domath.cpp
#include "domath.h"
int domath::add(int a, int b) {
return a + b;
}
// src/testdomath.cpp
#include "gtest/gtest.h"
#include "domath.h"
TEST(DoMathTests, testAdd){
domath m;
int actual = m.add(4, 6);
ASSERT_EQ(10, actual);
}
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ pip install gcovr
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ gcovr --version
gcovr 4.2
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ which gcovr
/home/ciaran/miniconda3/bin/gcovr
cmake_minimum_required(VERSION 3.15)
project(CoverageTest)
set(CMAKE_CXX_STANDARD 14)
# setup googletest
add_subdirectory(third_party/googletest)
# create our library
add_library(DoMath STATIC src/domath.h src/domath.cpp)
add_dependencies(DoMath gtest gtest_main)
# create the test executable
add_executable(TestDoMath src/testdomath.cpp)
target_include_directories(TestDoMath PRIVATE third_party/googletest/googletest)
target_link_libraries(TestDoMath PRIVATE
DoMath gtest gtest_main)
add_dependencies(TestDoMath DoMath gtest gtest_main)
# now for coverage bits
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
if (CMAKE_COMPILER_IS_GNUCXX)
include(CodeCoverage)
append_coverage_compiler_flags()
# we need to turn off optimization for non-skewed coverage reports
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")
# optional excludes - None needed here
# set(COVERAGE_EXCLUDES)
# importantly, set the path to the gcovr executable that you downladed
set(GCOVR_PATH "/home/ciaran/miniconda3/bin/gcovr")
# Works
setup_target_for_coverage_gcovr_xml(
NAME TestDoMathCoverageXml
EXECUTABLE TestDoMath
DEPENDENCIES TestDoMath DoMath
)
# Works
setup_target_for_coverage_gcovr_html(
NAME TestDoMathCoverageHtml
EXECUTABLE TestDoMath
DEPENDENCIES TestDoMath DoMath
)
# This one did not work for me:
setup_target_for_coverage_lcov(
NAME TestDoMathCoverageLcov
EXECUTABLE TestDoMath
DEPENDENCIES TestDoMath DoMath
)
endif ()