Можно ли измерить охват функции с помощью gcov? - PullRequest
8 голосов
/ 11 февраля 2009

В настоящее время мы используем gcov с нашим набором тестов для приложения Linux C ++, и он хорошо справляется с измерением покрытия линии.

Может ли gcov создавать отчет о покрытии функции / метода в дополнение к покрытию линии?

Глядя на параметры, которые принимает gcov, я не думаю, что это возможно, но я могу что-то упустить. Или, возможно, есть какой-либо другой инструмент, который может создать отчет о покрытии функции / метода из статистики, сгенерированной gcc?

Обновление: Под охватом функции / метода я имею в виду процент функций, которые выполняются во время тестов.

Ответы [ 3 ]

6 голосов
/ 11 февраля 2009

Мы начали использовать gcov и lcov вместе. Результаты lcov включают процент функций, которые выполняются для «модуля», который вы просматриваете.

РЕДАКТИРОВАТЬ: Модуль может переходить от каталогов к файлам.

Я также хочу добавить, что если вы уже используете инструменты компилятора GNU, то запуск gcov / lcov не составит большого труда, и результаты, которые он выдает, очень впечатляют.

6 голосов
/ 11 февраля 2009

Полагаю, вы имеете в виду опцию -f, которая даст вам процент линий, покрытых для каждой функции. Есть интересная статья о gcov на Dr. Доббса , что может быть полезно. Если «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
5 голосов
/ 18 ноября 2009

Утилита lcov хороша, и мы ее используем. Но я не уверен, нужно ли вам это для того, что вы хотите.

Мы

  1. Используйте ctags ( wikipedia ; sourceforge ), чтобы найти все функции, объявленные в соответствующих заголовочных файлах.

  2. Запустите GCOV, чтобы получить покрытие строки для каждой функции в двоичном файле.

  3. Сравните список функций из 1 и 2, чтобы получить «Вызванные функции» / «Доступные функции».

Мы называем это «покрытием API», поскольку применяем шаг № 1 только к общедоступным заголовкам API. Но вы можете сделать это на всех заголовках или только на подмножестве по вашему выбору. Я думаю, что соотношение, которое мы производим таким образом, - это соотношение, которое вы ищете.

...