[LINUX] Obtenez facilement la couverture du programme C avec les options de construction de configure!

J'ai écrit le code de test unitaire, mais y a-t-il vraiment assez de cas de test? ** Couverture **, qui est un indicateur visible à de tels moments, Linux inclut une bibliothèque appelée gcov en standard. Comme c'est un gros problème, changeons-le avec l'option de construction pour qu'il puisse être utilisé à tout moment!

** Acquisition de couverture: gcov **

** Comment utiliser **

La procédure est simple.

--Ajoutez -fprofile-arcs -ftest-coverage aux options de construction. --Définir le lien de bibliothèque -lgcov.

Vous pouvez le reconstruire avec ça.

** Ajouter aux options de construction! ** **

Je pense qu'il existe différentes façons de basculer avec les options de construction, mais je vais vous présenter la méthode avec la configuration que j'utilise actuellement. Veuillez vous référer à ici etc. lors de l'installation de configure.

Tout d'abord, ajoutez l'option ** --enable **.

  1. Ajouter une option avec AC_ARG_ENABLE (nom de l'option, [libellé de l'aide], [script lors de la spécification de l'option], valeur par défaut)
  2. Si l'option est valide, ajoutez l'option de bibliothèque gcov avec ʻAC_CHECK_LIB et l'option de construction GCOV_OPT pour gcov avec ʻAC_SUBST ([GCOV_OPT]).

configure.ac


###
# Unit test option
AC_ARG_ENABLE(coverage,
[  --enable-coverage      enable coverage test, only for developer of this package. Please "Don't" use this package if you install it, gcov is GPL license [[default=no]]],
[\
case "${enableval}" in
 yes) enable_coverage=yes ;;
 *)   AC_MSG_ERROR(bad value for --enable-) ;;
esac],
enable_coverage=no)

#check flag, and add gcov option
if test x"${enable_coverage}" = x"yes"; then
  AC_CHECK_LIB([gcov], [main])
  GCOV_OPT="-fprofile-arcs -ftest-coverage"
  AC_SUBST([GCOV_OPT])
fi

Après cela, vous pouvez passer le jeu d'options GCOV_OPT pour gcov à Makefile.am etc. La valeur par défaut est vide, vous pouvez donc l'ajouter. Dans cet exemple, je l'ai défini sur les paramètres communs à lire dans Makefile.am.

am.conf


AM_CPPFLAGS=-I$(top_srcdir)/design_pattern_util/include/ -I$(top_srcdir)/design_pattern_util/include/ $(GCOV_OPT)

En regardant l'aide, ça ressemble à ça. C'est amusant d'obtenir de l'aide. (Si vous écrivez le libellé avec AC_HELP_STRING, vous pouvez produire plus magnifiquement)

python


$ ./configure --help
  --enable-coverage      enable coverage test, only for developer of this package. Please "Don't" use this package if you install it, gcov is GPL license [default=no]

Si gcov est utilisé avec succès, vous aurez un fichier * .gcno à côté du code après la construction.

$ ls chain_of_responsibility/lib/
chain_element.c     chain_element.h   chain_element.o            chain_of_responsibility.gcno  chain_of_responsibility.map  libchainofresp.la  Makefile.am
chain_element.gcno  chain_element.lo  chain_of_responsibility.c  chain_of_responsibility.lo    chain_of_responsibility.o    Makefile           Makefile.in

Ensuite, exécutez le test et vous verrez la couverture. Il semble que vous puissiez également obtenir une couverture automatique avec cela.

** Vérifiez la couverture: lcov **

Je l'ai testé maintenant. Voyons le résultat! Même ainsi, le résultat est sorti sous forme de données binaires, c'est donc une bonne idée de ne pas le rendre visible aux humains. Le moyen le plus simple de comprendre le résultat est d'utiliser lcov.

Reportez-vous à la procédure de ici

  1. Téléchargez et décompressez tar.gz du site d'origine. L'intérieur était déjà construit. Installer avec make install
  2. Exécutez ce qui suit directement sous le code. Un fichier html sera créé dans le code.
$lcov -c -d . -o XXX.info
$genhtml -o . XXX.info

Lorsque vous ouvrez ʻindex.html`, vous pouvez voir le taux de couverture comme ceci. La couverture de ligne est la soi-disant couverture C0.

Dans cet exemple, le code de test est bien sûr sans erreur, donc le taux est faible, mais lib est de 90% ou plus. Si vous ouvrez l'intérieur, vous pouvez voir le code qui ne passe pas, mais comme il s'agit également d'un système anormal tel qu'une défaillance de malloc, on peut dire qu'il n'y a pas de problème de couverture de test du point de vue de la couverture. C'est comme ça.

** Impression **

La prochaine fois que je le toucherai, j'aimerais creuser un peu plus et le lier avec le script de test afin que le taux de couverture C0 puisse être vérifié automatiquement!

référence

gcov http://iyukki.blog56.fc2.com/blog-entry-154.html

lcov http://d.hatena.ne.jp/t-kado/20100622

Recommended Posts

Obtenez facilement la couverture du programme C avec les options de construction de configure!
Créez facilement des CNN avec Keras
Créez facilement des machines virtuelles avec Vagrant
Créez facilement un environnement de développement avec Laragon