55

我在我的项目中使用 CMake,并设置了一个 cdash 服务器以进行连续/夜间构建。一切正常,通过设置 crontab,我们每小时/每晚的构建/测试结果会自动上传到我们的 cdash 服务器。

我的下一步是将测试覆盖率报告添加到构建中。我在这里找到了文档http://www.cmake.org/Wiki/CTest:Coverage但坦率地说它离实用指南有点远。

目前我已经添加了 required 标志(而不是-fprofile-arcs -ftest-coverage,我觉得--coverage更好),编译过程会生成 .gcno 文件。但后来我被困住了。命令

make NightlyCoverage

似乎什么也没做。谁能告诉我下一步该做什么?我想要的结果make NightlyCoverage是生成覆盖率报告并将其上传到 cdash 服务器。

4

4 回答 4

56

我一直在成功使用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()

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

if(CMAKE_COMPILER_IS_GNUCXX)
    target_link_libraries(${PROJECT_TEST_NAME} gcov)
endif()

有了这个,我只需输入

make my_project_coverage

coverage我在构建树的目录中获得了 html 报告。

于 2013-05-14T06:22:07.163 回答
10

gcovr用来制作没有以下内容的GCC 代码覆盖率报告CodeCoverage.cmake

$ cd /path/to/your/project
$ mkdir build && cd build && cmake ..
$ make && make test
$ gcovr -r ../ .
于 2017-09-15T06:23:05.690 回答
6

我通过以下方式设置我的项目“foo”。将 cmake 文件从https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.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()

在cmake之后,构建目标 make make foo_coverage 并用构建文件夹中的 foo_coverage 文件夹中的 index.html 文件打开报告

于 2019-01-02T09:45:09.200 回答
3

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

  1. 创建了一个玩具项目
(base) ciaran@DESKTOP-K0APGUV:/mnt/d/CoverageTest$ tree -L 2
.
├── CMakeLists.txt
├── cmake
│   └── CodeCoverage.cmake
├── src
│   ├── domath.cpp
│   ├── domath.h
│   └── testdomath.cpp
└── third_party
    └── googletest

在哪里

// 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);
}
  1. 下载 googletest 并将其放在第三方目录下
  2. 将这个线程上其他答案所分享的要点复制到cmake/CodeCoverage.cmake
  3. 安装gcovr. 此步骤至关重要,因为此线程上的其他答案不再适用于gcovr我已经拥有的版本:
(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

注意,我们需要gcovrcmake 脚本的输出。4) 编写一个创建库、测试可执行文件并使用CodeCoverage.cmake模块的 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 ()

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

祝你好运。

于 2020-07-04T14:39:30.850 回答