[LINUX] Mit den Build-Optionen von configure erhalten Sie ganz einfach eine C-Programmabdeckung!

Ich habe den Unit-Test-Code geschrieben, aber gibt es wirklich genug Testfälle? ** Abdeckung **, die zu solchen Zeiten ein sichtbarer Indikator ist, enthält Linux standardmäßig eine Bibliothek namens "gcov". Da es eine große Sache ist, wechseln wir es mit der Build-Option, damit es jederzeit verwendet werden kann!

** Deckungserwerb: gcov **

** Wie benutzt man **

Das Verfahren ist einfach.

Sie können es damit neu erstellen.

** Zum Erstellen von Optionen hinzufügen! ** **.

Ich denke, es gibt verschiedene Möglichkeiten, mit Build-Optionen zu wechseln, aber ich werde die Methode mit der selbst erstellten Konfiguration einführen, die ich derzeit verwende. Bitte beziehen Sie sich bei der Installation von configure auf hier usw.

Fügen Sie zunächst die Option ** --enable ** hinzu.

  1. Option mit AC_ARG_ENABLE hinzufügen (Optionsname, [Hilfetext], [Skript bei Angabe der Option], Standardwert)
  2. Wenn die Option gültig ist, fügen Sie die Bibliotheksoption "gcov" mit "AC_CHECK_LIB" und die Erstellungsoption "GCOV_OPT" für gcov mit "AC_SUBST ([GCOV_OPT])" hinzu.

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

Danach können Sie die für gcov festgelegte Option GCOV_OPT an Makefile.am usw. übergeben. Der Standardwert ist leer, sodass Sie ihn hinzufügen können. In diesem Beispiel habe ich die allgemeinen Einstellungen festgelegt, die in Makefile.am gelesen werden sollen.

am.conf


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

Wenn man sich die Hilfe ansieht, sieht es so aus. Es macht Spaß, Hilfe zu bekommen. (Wenn Sie den Wortlaut mit AC_HELP_STRING schreiben, können Sie eine schönere Ausgabe durchführen.)

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]

Wenn gcov erfolgreich verwendet wird, haben Sie nach dem Erstellen eine * .gcno-Datei neben dem Code.

$ 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

Führen Sie dann den Test aus und Sie sehen die Abdeckung. Es scheint, dass Sie damit auch eine automatische Abdeckung erhalten können.

** Überprüfen Sie die Abdeckung: lcov **

Ich habe es jetzt getestet. Mal sehen, das Ergebnis! Selbst wenn dies der Fall ist, wird das Ergebnis als Binärdaten ausgegeben, sodass es nur dann angezeigt wird, wenn Sie es für den Menschen nicht sichtbar machen. Der einfachste Weg, das Ergebnis zu verstehen, ist die Verwendung von "lcov".

Siehe das Verfahren von hier

  1. Laden Sie [tar.gz der ursprünglichen Site] herunter und entpacken Sie es (http://ltp.sourceforge.net/coverage/lcov.php). Das Innere wurde bereits gebaut. Installieren Sie mit make install
  2. Führen Sie Folgendes direkt unter dem Code aus. Im Code wird eine HTML-Datei erstellt.
$lcov -c -d . -o XXX.info
$genhtml -o . XXX.info

Wenn Sie "index.html" öffnen, sehen Sie die Abdeckungsrate wie folgt. Leitungsabdeckung ist die sogenannte C0-Abdeckung.

In diesem Beispiel ist der Testcode natürlich fehlerfrei, daher ist die Rate niedrig, aber lib beträgt 90% oder mehr. Wenn Sie das Innere öffnen, können Sie den Code sehen, der nicht bestanden wird. Da es sich jedoch auch um ein abnormales System wie einen Malloc-Fehler handelt, kann gesagt werden, dass es unter dem Gesichtspunkt der Abdeckung kein Problem mit der Testabdeckung gibt. Es ist wie es ist.

** Eindruck **

Wenn ich es das nächste Mal berühre, möchte ich etwas tiefer graben und es mit dem Testskript verknüpfen, damit die C0-Abdeckungsrate automatisch überprüft werden kann!

Referenz

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

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

Recommended Posts

Mit den Build-Optionen von configure erhalten Sie ganz einfach eine C-Programmabdeckung!
Erstellen Sie einfach CNNs mit Keras
Erstellen Sie mit Vagrant ganz einfach virtuelle Maschinen
Erstellen Sie mit Laragon ganz einfach eine Entwicklungsumgebung