Подробное руководство по использованию 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, но он немного устарел, поэтому я поделюсь своим решением. Вот что я сделал:
- создал игрушечный проект
(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);
}
- загрузите googletest и поместите его в сторонний каталог
- скопируйте суть, любезно предоставленную другими ответами в этой теме, в
cmake/CodeCoverage.cmake
- установить
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