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!
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.
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
**.
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.
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
make install
$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.
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!
gcov http://iyukki.blog56.fc2.com/blog-entry-154.html
lcov http://d.hatena.ne.jp/t-kado/20100622