Подробное руководство по использованию gcov с CMake/CDash?

Я использую CMake с моим проектом и настраиваю сервер cdash для непрерывного / ночного построения. Все работает хорошо, и, настроив crontab, мы получаем результаты ежечасной / ночной сборки / тестирования, автоматически загружаемые на наш cdash-сервер.

Мой следующий шаг - добавить отчет о тестовом покрытии в сборку. Я нахожу документ здесь http://www.cmake.org/Wiki/CTest:Coverage но, честно говоря, он немного далек от практического руководства.

В настоящее время я добавил обязательный флаг (вместо -fprofile-arcs -ftest-coverage, Я нахожу --coverage лучше), процесс компиляции генерирует файлы.gcno. Но тогда я застрял. Команда

make NightlyCoverage

кажется, ничего не делает. Кто-нибудь может сказать мне, что делать дальше? Результат, который я хочу, это сделать make NightlyCoverage, отчеты о покрытии генерируются и загружаются на сервер cdash.

2 ответа

Решение

Я успешно использую 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

и я получаю отчет в формате HTML в coverage каталог моего дерева сборки.

У меня есть ужасный метод, чтобы использовать gcovr сделать отчет о покрытии кода GCC без CodeCoverage.cmake: переместить все *.gcno а также *.gcda файлы в корневой каталог проекта, а затем запустить gcovr

$ cd /path/to/your/project
$ mkdir build && cd build && cmake ..
$ make && make test
$ find . -type f \( -iname \*.gcno -or -iname \*.gcda \) -exec cp {} .. \;
$ cd .. 
$ gcovr -v -r .

Этот ответ такой же, как ответ @rcomblen, но он немного устарел, поэтому я поделюсь своим решением. Вот что я сделал:

  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

Обратите внимание, нам нужен вывод которого gcovrдля скрипта cmake. 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 ()

И это все. Теперь просто создайте новые цели.

Удачи.

Я настроил свой проект "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 и откройте отчет с файлом index.html в папке foo_coverage в папке build

Другие вопросы по тегам