TÜV-zertifiziertes GoogleTest-Framework

Code-Coverage-Ziele mit GoogleTest und C/C++test CT erreichen

Eine ausreichende Code-Abdeckung ist für sicherheitskritische Software von zentraler Bedeutung. C/C++test CT und GoogleTest unterstützen dabei, Coverage-Kennzahlen zu erfassen und Testlücken gezielt zu identifizieren.

4 min
Grafik zu Software-Testing mit Lupe über Quellcode und technischen Symbolen im Hintergrund.
Wie lässt sich Code-Coverage mit C/C++test CT und GoogleTest überwachen und bei sicherheitskritischer Software gezielt verbessern?

Für Entwickler von sicherheitskritischen Systemen bedeutet die Erfüllung von Vorgaben zur Codeabdeckung mehr, als nur Tests auszuführen, sei es in Medical, Industrieautomatisierung, Automotive oder Luft-/Raumfahrt. Sie erfordert einen grundlegend integrierten Arbeitsablauf bestehend aus dem Framework für Komponententests, der Rückverfolgbarkeit von Anforderungen und den Tools zur Abdeckungsmessung.

In diesem Beitrag wird erläutert, wie sich mit C/C++test CT und TÜV-zertifizierten GoogleTest Code-Coverage-Kennzahlen überwachen und Lücken in der Code-Abdeckung bei sicherheitskritischer Software effizient identifizieren und beheben lassen.

Konformitätsanforderungen für Unit-Tests

Unit-Tests sind ein grundlegender Bestandteil des Verifizierungs- und Validierungsprozesses (V&V) für embedded, sicherheitskritische Software. Alle wichtigen Standards für funktionale Sicherheit verlangen einen objektiven Nachweis der Testvollständigkeit auf Unit-Ebene.

In der Regel wird diese Vollständigkeit durch Anforderungsverfolgbarkeit und Berichte zur strukturellen Codeabdeckung nachgewiesen. Folglich muss jedes im Rahmen der Konformitätsprüfung eingesetzte Unit-Test-Framework nahtlos in das Anforderungsmanagementsystem (RMS) und die Codeabdeckungstools des Projekts integriert sein.

Wie lassen sich Abdeckungslücken systematisch erkennen und zu schließen?

Idealerweise beginnen Teams in einem Entwicklungsszenario mit klar definierten Anforderungen und einer vollständigen Testspezifikation. Die Implementierung erfolgt im Einklang mit diesen Anforderungen. Code-Abdeckungsberichte liefern objektive Belege für die Vollständigkeit der Verifizierung auf Quellcodeebene.

In der Praxis erreichen Teams dieses Ideal jedoch selten. Oft beginnen sie mit der Implementierung und der Testentwicklung auf der Grundlage unvollständiger oder sich noch weiterentwickelnder Anforderungen. In einigen Fällen fehlen formale Anforderungen möglicherweise gänzlich, beispielsweise wenn V&V- und Sicherheitsprozesse rückwirkend auf eine Legacy-Codebasis Anwendung finden, die ursprünglich nicht unter einem funktionalen Sicherheits-Framework entwickelt wurde. In solchen Situationen laufen Entwicklung, Anforderungsdefinition und Testerstellung parallel ab. Dieser Arbeitsablauf zwingt Teams dazu,

  • Lücken in Code-Abdeckungsberichten iterativ zu analysieren,

  • zu ermitteln, welche Eingabestimuli oder Ausführungsszenarien fehlen, um nicht abgedeckten Code zu testen, und

  • die Anforderungen auf der Grundlage des beobachteten Systemverhaltens kontinuierlich zu verfeinern.

Eine Abdeckungslücke kann auf toten Code, einen fehlenden Testfall oder eine unvollständige bzw. undefinierte Anforderung hinweisen. Die entscheidende Aufgabe besteht darin, die Gründe zu verstehen, warum eine bestimmte Codestruktur ungetestet bleibt. Bei einfachen Metriken wie der Zeilenabdeckung ist diese Analyse oft unkompliziert. Fortgeschrittenere Kriterien wie MC/DC (Modified Condition/Decision Coverage) können die Ursachenanalyse jedoch erheblich erschweren. In der Praxis beginnt der Prozess oft mit der Identifizierung einer Abdeckungslücke. Anschließend erfolgt die Analyse der fehlenden Stimuli, die notwendig sind, um den nicht abgedeckten Code auszuführen. Auf der Grundlage dieser Analyse erstellen Entwickler einen Testfall, um zuvor nicht getestetes Verhalten abzudecken. Der Testfall dient als Grundlage für ein besseres Systemverständnis sowie für nachfolgende Verfeinerungen und Anforderungsdefinitionen. Unit-Test-Tools können diesen Prozess unterstützen, indem sie Details zu Abdeckungsmängeln liefern und in einigen Fällen beim Erstellen der ersten Testfälle helfen.

Vereinfachung der Analyse von Abdeckungslücken

Das in Parasoft C/C++test CT integrierte GoogleTest-Framework ist das branchenweit erste TÜV-zertifizierte Framework seiner Art für die sicherheitskritische Entwicklung. Es unterstützt Standards wie ISO 26262, IEC 61508, IEC 62304 und EN 50716 und erleichtert die Analyse von Abdeckungslücken erheblich. Zudem umfasst die Software KI-basierte Funktionen zur automatisierten Generierung von Testfällen. Mithilfe von Parasoft C/C++test CT können Teams ihre GoogleTest-Testsuiten ausführen und die Code-Coverage sowohl lokal als auch innerhalb von CI-Pipelines erfassen.

Illustration mit GoogleTest-Grafik, Codeabdeckungsdiagramm und Entwickler am Computer.
Viele Teams führen eine Teilmenge der GoogleTest-Testfälle lokal aus, bevor sie Änderungen in der CI-Pipeline übernehmen. Die Ergebnisse können in der IDE analysiert werden.

Viele Teams schätzen es, zunächst eine gezielte Teilmenge der GoogleTest-Testfälle lokal und anschließend die vollständige Testsuite in der CI-Pipeline auszuführen, bevor sie Änderungen übernehmen. Die Ergebnisse können direkt in der IDE analysiert werden, was einen effizienten Feedback-Kreislauf ermöglicht und die Grundlage für eine schnelle und unkomplizierte Bearbeitung gewährleistet. C/C++test CT bietet Teams, die Visual Studio Code verwenden, optimierte Unterstützung für diesen Workflow.

Die Lückenanalyse folgt, sobald die Abdeckungsberichte vorliegen. C/C++test CT vereinfacht diesen Prozess, insbesondere bei anspruchsvolleren Abdeckungskriterien. Der folgende Screenshot zeigt ein Beispiel für MC/DC-Abdeckungsergebnisse für eine bestimmte Entscheidung innerhalb einer Funktion.

Die Ergebnisse bieten eine detaillierte Aufschlüsselung der Bedingungen innerhalb der Entscheidung und enthalten eine Tabelle mit dem minimal erforderlichen Satz an Testvektoren für eine vollständige Abdeckung. Dieser minimale Satz weist Entwicklern die spezifischen Bedingungen für die Erfüllung der MC/DC-Anforderungen aus.

Screenshot mit Quellcode, Testdaten und MC/DC-Abdeckungsanzeige in Parasoft C/C++test CT.
Ein Beispiel für MC/DC-Abdeckungsergebnisse einer bestimmten Entscheidung innerhalb einer Funktion in Parasoft C/C++test CT.

Fehlende GoogleTest-Testfälle erstellen und generieren

Wurden Lücken in der Testabdeckung erkannt, besteht der nächste Schritt in der Regel darin, einen oder mehrere Testfälle zu entwickeln, um den nicht abgedeckten Code abzudecken. So können Teams beurteilen, ob Aktualisierungen oder Verfeinerungen der Anforderungen notwendig sind. Dies ist in vielen Projekten gängige Praxis.

Diese Testfälle können manuell auf der Grundlage der von C/C++test CT bereitgestellten Abdeckungsinformationen erstellt oder mithilfe der verfügbaren Tool-Unterstützung automatisch generiert werden.

C/C++test CT enthält einen MCP-Server, der strukturierte Abdeckungsdaten für KI-Agenten bereitstellt. Für erweiterte Metriken wie MC/DC umfassen diese Daten detaillierte Informationen zu fehlenden Testvektoren, die erforderlich sind, um alle Bedingungen innerhalb einer bestimmten Entscheidung vollständig abzudecken. Mit dem MCP-Server von C/C++test CT können Benutzer den KI-Agenten beispielsweise mit folgendem Befehl auffordern: „Generieren Sie GoogleTest-Testfälle, um Abdeckungslücken in der Datei < > zu beseitigen.” Die folgende Grafik zeigt eine vereinfachte Darstellung des Datenflusses zwischen der Abdeckungs-Engine, dem MCP-Server und dem KI-Agenten.

Diagramm zu GoogleTest, Codeabdeckung und KI-Agenten in einer Entwicklungsoberfläche.
Der Datenfluss zwischen der Coverage-Engine, dem MCP-Server und dem KI-Agenten ist vereinfacht, was die Kommunikation zwischen diesen Systemen verbessert.

Mithilfe dieser strukturierten Eingaben können KI-Agenten automatisch GoogleTest-Testfälle generieren, die auf bisher nicht abgedeckte Szenarien abzielen. So wird die Abdeckung verbessert und gleichzeitig der Entwicklungsaufwand reduziert. Entwickler können diese generierten Tests anschließend überprüfen und ihre Relevanz im Hinblick auf das Systemverhalten sowie bestehende oder noch zu definierende Anforderungen bewerten.

Integrierter Workflow für sicherheitskritische Software

Sicherheitsstandards (z.B. ISO 26262, DO-178C, IEC 61508) verlangen objektive Nachweise für die Vollständigkeit der Tests sowie eine nahtlose Integration zwischen Unit-Test-Frameworks, RMS und Abdeckungstools. In realen Projekten analysieren Teams in einem iterativen Prozess die Abdeckungslücken und entwickeln Testfälle. Diese Tests dienen der Verfeinerung der Anforderungen. Gut integrierte Tools können hierbei unterstützen. Die Parasoft-Lösung beinhaltet das TÜV-zertifizierte GoogleTest zur Dokumentation der Sicherheitsprozesse und zur Unterstützung der Ausführung in CI-Pipelines. Zudem optimiert sie die MC/DC-Analyse (Modified Condition/Decision Coverage) durch Bereitstellung minimaler Testvektoren für nicht abgedeckte Bedingungen. Ein MCP-Server liefert Abdeckungsdaten für KI-Agenten. Benutzer können automatische GoogleTest-Testfälle anfordern, die auf nicht abgedeckte Szenarien abzielen. Entwicklerhaben die Möglichkeit, die Tests zu überprüfen. Die Kombination aus dem TÜV-zertifizierten GoogleTest-Framework und KI-gestützter Testgenerierung ermöglicht es Teams, Lücken effizient zu identifizieren, fehlende Tests zu generieren und einen Verifizierungs-Workflow für modernes C++ aufrechtzuerhalten. (bs)

Autor

Miroslaw Zielinski, Direktor Produktmanagement bei Parasoft