Dez 042020
 

Mit Code Coverage kann geprüft werden, welche Zeilen in einem Programm wie häufig aufgerufen werden. Das hat im Wesentlichen zwei Vorteile:

  1. Man kann toten Code entdecken
  2. Man kann durch die sog. Testabdeckung feststellen, ob wirklich alle Code-Teile beim Test durchlaufen werden.

Gerade der letzte Punkt ist wichtig, da man mit der angestrebten Testabdeckung von 100% jeden erdenklichen Testfall – auch im Fehlerfall – durchlaufen hat. Man kann dadurch (theoretisch) vollständig testen, ob sich der geprüfte Code wie gewünscht verhält.

Coverage vorbereiten

Zuerst müssen die Compiler Flags angepasst werden. Dazu ergänzt man das Makefile mit dieden Zeilen:

CXXFLAGS += --coverage
CFLAGS   += --coverage
LDFLAGS  += --coverage
LIBS     += -lgcov

Alternativ kann man im Qt-Project-File folgende Ergänzung machen:

linux:CONFIG(gcov) {
    QMAKE_CXXFLAGS += --coverage
    QMAKE_LFLAGS   += --coverage
    LIBS           += -lgcov
}

Danach muss man noch das Makefile generieren:

qmake CONFIG+=debug CONFIG+=gcov

Abschließend muss nur noch das Programm mit Aufruf von make gebaut werden.

Programm aufrufen und Coverage auswerten

Die oben angegebenen Compiler Flags instrumentieren den lauffähigen Code. Daher muss das Programm nur noch aufgerufen werden. Dabei werden Dateien mit der Endung .gcda und gcno generiert. Im nächsten Schritt werden diese Dateien ausgewertet und danach in einem HTML-Report veröffentlicht.

Nach dem Programmaufruf muss daher Folgendes aufgerufen werden:

lcov --no-external -c --directory $PWD -o coverage.info
genhtml coverage.info --legend --title="GStreamer/PJ Media Abstraction" --output-directory out

Die Option --no-external verhindert, dass später im Report die Includes des Compilers auftauchen. Die sind in der Regel uninteressant.

Hat man mehrere ausführbare Testprogramme, dann muss für jeden Aufruf eine eigene .info-Datei erzeugt werden. Abschließend muss eine zusammenhängende .info-Datei generiert werden. Das Erzeugen des HTML-Reports erfolgt wie gewohnt:

./a-test
lcov --no-external -c -d $PWD -o a-test.info
./b-test
lcov --no-external -c -d $PWD -o b-test.info

lcov -a a-test.info -a b-test.info -o coverage.info
genhtml coverage.info --legend --title="GStreamer/PJ Media Abstraction" --output-directory out

Referenzen

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)