Code Coverage in C++: Von Gcov zu Qualitätsmetriken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum "grüne" Tests noch kein Sieg sind?

\n\n

Stellen Sie sich vor: Sie starten tausend Unit-Tests, alle bestehen mit einem grünen Häkchen, die CI-Pipeline ist glücklich, der Manager zufrieden. Aber eine Woche vergeht, und in der Produktion tritt ein kritischer Fehler auf. Kommt Ihnen das bekannt vor? Meistens liegt das Problem darin, dass Tests existieren, aber sie prüfen nicht den tatsächlich ausgeführten Code. Sie testen möglicherweise nur 10% des Quellcodes, während die restlichen 90% eine "Grauzone" sind, in der sich Fehler verstecken.

\n\n

Genau hier kommt Code Coverage in C++ ins Spiel. Es ist nicht nur eine modische Metrik für den Bericht an den Kunden. Es ist Ihr Röntgengerät, das zeigt: welche Codezeilen während der Tests tatsächlich ausgeführt werden und welche nie gestartet wurden. Heute werden wir besprechen, wie man Coverage-Werkzeuge in C++ richtig einrichtet, welche Metriken wirklich wichtig sind und wie man nicht in falschen Positiven ertrinkt.

\n\n

Was ist Code Coverage und warum braucht ein C++-Entwickler sie?

\n\n

Code Coverage ist eine Metrik, die anzeigt, wie viel Prozent des Quellcodes Ihres Programms während der Testausführung ausgeführt wurden. In C++ ist dies besonders kritisch, da die Sprache das Schreiben von Low-Level-Code, Optimierungen und Template-Magie ermöglicht, die im unerwartetsten Moment "einschlagen" kann.

\n\n

Wichtige Arten von Coverage-Metriken

\n

Nicht alle Metriken sind gleich nützlich. Hier ist, was wirklich zählt:

\n
    \n
  • Line Coverage (Zeilenabdeckung) — die grundlegendste Metrik. Wie viele Quellcodezeilen wurden berührt. Leicht zu messen, aber auch leicht zu täuschen.
  • \n
  • Branch Coverage (Zweigabdeckung) — prüft, ob beide Zweige jeder if/else- oder switch-Anweisung durchlaufen wurden. Viel ehrlicher als Line Coverage.
  • \n
  • Function Coverage (Funktionsabdeckung) — wurde die Funktion mindestens einmal aufgerufen? Nützlich zum Auffinden von "totem" Code.
  • \n
  • Condition Coverage (Bedingungsabdeckung) — prüft alle Unterausdrücke in komplexen logischen Operatoren (&&, ||). Die strengste, aber auch die ressourcenintensivste.
  • \n
\n\n

Für ein normales C++-Projekt gilt ein Ziel von 70-80% Line Coverage und mindestens 60% Branch Coverage als guter Stil. 100% Coverage ist eine Utopie, aber das Anstreben von 90% in kritischen Modulen (Speicherverwaltung, Netzwerkprotokolle) ist eine durchaus realistische Aufgabe.

\n\n

Werkzeuge zur Analyse der C++-Code-Abdeckung

\n\n

Das C++-Ökosystem bietet mehrere leistungsstarke Werkzeuge. Wir betrachten die Top 3, die tatsächlich in der Produktion verwendet werden.

\n\n

1. Gcov — der Klassiker von GCC

\n

gcov ist ein integriertes Werkzeug im GCC-Compiler. Es arbeitet auf Maschinencode-Ebene und liefert daher sehr genaue Ergebnisse. Hauptvorteile: kostenlos, Open Source, funktioniert mit CMake und Makefile.

\n

So starten Sie es:

\n
// Kompilieren mit Coverage-Flags\ng++ -fprofile-arcs -ftest-coverage -O0 main.cpp -o test_app\n\n// Tests ausführen\n./test_app\n\n// Bericht generieren\ngcov main.cpp
\n

Danach erhalten Sie *.gcov-Dateien, die anzeigen, wie oft jede Zeile ausgeführt wurde. Nachteil: Das Ausgabeformat ist textuell und nicht sehr anschaulich.

\n\n

2. LCOV — grafische Oberfläche für Gcov

\n

lcov ist ein Aufsatz auf gcov, der schöne HTML-Berichte generiert. Sie können grüne (abgedeckte) und rote (nicht abgedeckte) Zeilen direkt im Browser sehen.

\n
# Coverage-Daten sammeln\nlcov --capture --directory . --output-file coverage.info\n\n# HTML generieren\ngenhtml coverage.info --output-directory coverage_report
\n

Dies ist der Industriestandard für CI/CD. Jenkins, GitLab CI, GitHub Actions — überall kann die automatische Generierung von LCOV eingerichtet werden.

\n\n

3. Clang Sanitizer Coverage (Source-based)

\n

Wenn Sie Clang verwenden, haben Sie Zugriff auf -fsanitize-coverage. E

Blogs

Buchempfehlungen