Покрытие кода (code coverage)

Покрытие кода – метрика ПО, показывающая процент исходного кода программы, который был выполнен в процессе тестирования.

Платформы тестирования С/C++ кода:

Платформа модульного тестирования Майкрософт для C++ (VS)

Google Test

Boost.Test

CTest (CMake)

[Catch2, [in CLion](https://www.jetbrains.com/help/clion/catch-tests-support.html]](https://github.com/catchorg/Catch2)

OpenCppCoverage (C++, Windows)

gcov(CLI) / lcov (GUI) (GCC)

llvm-cov (LLVM/Clang, CLI)

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