Определяне на покритието на кода в C

Определяне на покритие на C/C++ код чрез тестове

Определянето на степента на покритие на кода чрез тестове е много, много важно най-малко поради две причини. Първо, той проверява дали тестовете изпълняват всеки от редовете код, който пишете поне веднъж. Ако не стане, има вероятност тестовете ви да са доста скапани. Второ, можете да намерите "мъртъв" код, който всъщност никога не се изпълнява, и да го изхвърлите. Днес ще разберем как да видим покритието на кода в програми, написани на C или C++.

Ако използвате GCC

Тази опция беше тествана от мен на FreeBSD 10.3 и GCC 4.9. Освен това се нуждаем от пакета lcov:

Когато изграждаме проекта, използваме следните флагове:

Изграждаме проекта както обикновено, след което изпълняваме make check. Ще работи значително по-бавно от обикновено. Това ще генерира куп *.gcda файлове:

# на FreeBSD lcov в противен случай няма да намери gcov sudo ln -s / usr / local / bin / gcov49 / usr / local / bin / gcov

lcov --директория src --capture --изходен файл postgresql.info

В края на програмата ще видим нещо подобно:

Може например да бъде анализиран с регулярни изрази и в Дженкинс да счита компилацията за повредена, ако процентът на покритие на кода от тестове падне под посочения. Опитахме се да направим това, така че програмистите да не бъдат мързеливи да пишат тестове за нови функции. Проверено работи.

Ето как изглежда самият отчет:

покритието

Отчетът показва кои части от кода не са били изпълнени:

gcov

Всичко е просто и ясно!

Ако използвате CLang

Под FreeBSD не успях да създам отчет за покритие на кода с помощта на CLang 3.8. При компилиране възниква грешка:

В крайна сметка трябваше да използвамUbuntu 14.04 (все още не бързам да надстроя до 16.04). За да инсталираме CLang и LLDB 3.8 казваме:

В /etc/apt/sources.list добавете:

Изграждаме проекта със същите флагове, които бяха използвани в случая на GCC:

Отново казваме направете проверка. Данните за покритието на кода се събират много по-бързо, отколкото с GCC.

Сега имаме нужда от нещо като този /usr/bin/llvm-cov-wrapper скрипт:

използвайте строг; използвайте предупреждения;

my $args = "@ARGV" ; печат STDERR "LLVM-COV-WRAPPER: args = '$args' \n " ;

if ( $args eq "-v" ) < отпечатайте "gcov (Колекция от портове на FreeBSD) 4.2.4 20151202 " . "(предварителна версия)\n" ; > иначе < my $cmd = "llvm-cov-3.8 gcov $args" ; отпечатайте STDERR "LLVM-COV-WRAPPER: изпълнение на '$cmd' \n " ; система ($cmd); >

Защо е необходим този грозен хак с --gcov-tool? Факт е, че по подразбиране lcov използва помощната програма gcov. Системата има инсталиран gcov 4.8. Въпреки това CLang генерира *.gcda, които са съвместими с 4.2 и следователно gcov не може да ги анализира. Чрез предаване на персонализиран --gcov-tool ние (1) извеждаме фалшив номер на версия, карайки lcov да мисли, че използва gcov 4.2 (2) вместо gcov ние караме lcov да използва командата llvm-cov, която анализира добре генерираните *.gcda файлове.

Заключение

Обърнете внимание, че в много проекти не е необходимо да се правят всички неща, описани по-горе. По-специално, в PostgreSQL можете да получите отчет за покритието на кода като този:

Създавате ли отчети за покритието на кода с тестове и ако да, с какво?