Покрытие кода (code coverage)
Покрытие кода – метрика ПО, показывающая процент исходного кода программы, который был выполнен в процессе тестирования.
Платформы тестирования С/C++ кода:
Платформа модульного тестирования Майкрософт для C++ (VS)
[Catch2, [in CLion](https://www.jetbrains.com/help/clion/catch-tests-support.html]](https://github.com/catchorg/Catch2)
OpenCppCoverage (C++, Windows)
Code coverage с llvm-cov
Устанавливается вместе с LLVM.
Рассмотрим пример:
include/max.hpp
#pragma once
template<typename T>
T max(const T &a, const T &b)
{
return (a >= b ? a : b);
}
struct Pixel
{
char r, g, b;
};
#define Y(p) (0.299*(p.r) + 0.587*(p.g) + 0.114*(p.b))
template<>
Pixel max<Pixel>(const Pixel &a, const Pixel &b)
{
return (Y(a) > Y(b)) ? a : b;
}tests.cpp
Для того, чтобы покрытие кода можно было измерить, необходимо собрать программу с опциями -fprofile-instr-generate -fcoverage-mapping. Эти опции говорят компилятору о необходимости вставки дополнительных инструкций для сбора статистики.
В нашем случае (сборка из корня проекта):
Если запустить собранный файл:
то в результате запуска будет сгенерирован файл default.profraw – файл, содержащий данные профайлинга.
Если проект содержит несколько main-функций (main.cpp и tests.cpp), то можно сгенерировать разные profraw и затем объединить в единый отчёт:
profdata – промежуточный файл llvm-cov, используемый для генерации отчёта.
Для генерации отчёта можно использовать
В результате исполнения данной команды будет создана директория coverage_report, в которой появится отчёт в формате HTML, в который не будут включены результаты, содержащие подстроку gtest (исключаем все логи про покрытие тестами самого gtest).
В случае приведённого выше кода статистика будет следующей:


Подробнее здесь.
Code coverage с gcov

Аналог: gcovr.
Установка: pip install gcovr
Идея аналогична llvm-cov – генерируются файлы профайлинга, а затем из них формируется отчёт.
Пример использования здесь.
Вариант описания CMakeLists.txt для автоматической сборки и формирования отчёта о покрытии кода:
Code coverage в Visual Studio

Code coverage в CLion

Last updated