Можно ли измерить покрытие функции с помощью gcov?
-
22-08-2019 - |
Вопрос
В настоящее время мы используем gcov с нашим пакетом тестирования для приложения Linux C ++, и он хорошо справляется с измерением покрытия линии.
Может ли gcov создать отчет о покрытии функции / метода в дополнение к покрытию линии?
Глядя на параметры, которые принимает gcov, я не думаю, что это возможно, но, возможно, я что-то упускаю.Или, возможно, есть ли какой-либо другой инструмент, который может создать отчет о покрытии функций / методов на основе статистики, сгенерированной gcc?
Обновить: Под охватом функций / методов я подразумеваю процент функций, которые выполняются во время тестов.
Решение
Я предполагаю, что вы имеете в виду опцию -f, которая даст вам процентное количество строк, покрытых для каждой функции.Интересная статья о gcov есть на ДокторДоббс что могло бы быть полезно.Если "man gcov" не показывает флаг -f, проверьте, установлена ли у вас достаточно свежая версия пакета gcc.
Редактировать: чтобы получить процент неисполненных функций, вы можете просто проанализировать выходные данные покрытия функции, так как покрытие 0,00% должно быть в значительной степени эквивалентно тому, что не вызывается.Этот небольшой скрипт выводит процент неисполненных функций:
#!/bin/bash
if test -z "$1"
then
echo "First argument must be function coverage file"
else
notExecuted=`cat $1 | grep "^0.00%" | wc -l`
executed=`cat $1 | grep -v "^0.00%" | wc -l`
percentage=$(echo "scale=2; $notExecuted / ($notExecuted + $executed) * 100" |bc)
echo $percentage
fi
Другие советы
Мы начали использовать gcov и lcov ( лков ) вместе.Результаты lcov действительно включают процент функций, которые выполняются для "модуля", на который вы смотрите.
Редактировать: В модуль может переходить от каталогов к файлам.
Я также хочу добавить, что если вы уже используете инструменты компиляции GNU, то запустить gcov / lcov для вас не составит большого труда, и результаты, которые он дает, очень впечатляют.
Утилита lcov хороша, и мы ею пользуемся.Но я не уверен, нужно ли вам это для того, чего вы хотите.
Мы
Используйте ctags (википедия; кузница источника), чтобы найти все функции, объявленные в соответствующих заголовочных файлах.
Запустите GCOV, чтобы получить линейное покрытие для каждой функции в двоичном файле.
Сравните список функций из 1 и 2, чтобы получить "Вызываемые функции" / "Доступные функции".
Мы называем это "покрытие API", поскольку применяем шаг # 1 только к общедоступным заголовкам API.Но вы можете сделать это для всех заголовков или только для подмножества по вашему выбору.Я думаю, что соотношение, которое мы получаем таким образом, - это то соотношение, которое вы ищете.