Ist GoogleTest eine Option? Das richtige Unit-Testing-Framework für sicherheitskritische Software und Konfomität

Von Miroslaw Zielinski* 8 min Lesedauer

Anbieter zum Thema

GoogleTest ist in C++-Teams beliebt. Doch reicht es für sicherheitskritische Software? Hierauf kommt es bei Unit-Testing, Tool-Qualifizierung und Konformität an.

Unit-Tests in regulierten Branchen müssen mehr leisten als reine Fehlerprüfung. Der Artikel zeigt, wie GoogleTest bewertet wird und welche Rolle C/C++test CT dabei spielen kann.(Bild:  Parasoft)
Unit-Tests in regulierten Branchen müssen mehr leisten als reine Fehlerprüfung. Der Artikel zeigt, wie GoogleTest bewertet wird und welche Rolle C/C++test CT dabei spielen kann.
(Bild: Parasoft)

Entwickler von sicherheitskritischer C- und C++-Software müssen das richtige Framework für Unit-Tests auswählen. Normen wie ISO 26262, DO-178C und IEC 61508 schreiben Anforderungsverfolgbarkeit, strukturelle Codeabdeckung und Qualifizierung der Tools vor, um die Konformität sicherzustellen. Bislang setzten Unternehmen auf proprietäre Frameworks. Heute nutzen viele Entwicklerteams Open-Source-Optionen wie GoogleTest. Das spart Schulungskosten und beschleunigt die Einführung. GoogleTest erfüllt jedoch nicht alle Anforderungen. Um sicherheitskritische Anforderungen zu erfüllen, muss seine Funktionalität erweitert und seine Dokumentation verbessert werden. Wichtige Kriterien für Unit-Testing-Frameworks in sicherheitskritischen Umgebungen sind:

  • Flexibilität,
  • nahtlose Integration mit Bazel und CMake,
  • weit verbreitete Vertrautheit unter Entwicklern.

Bei der Auswahl eines Unit-Testing-Frameworks für die sicherheitskritische Entwicklung ist ein Balanceakt zwischen Konformität, Produktivität und Kosten zu vollbringen. Open-Source-Tools sind kostengünstig, bieten aber keinen zertifizierten Support und keine Qualifizierungskits. Das birgt Risiken in regulierten Umgebungen. Proprietäre Frameworks bieten dagegen Konformitätsfunktionen und werden durch den Support des Anbieters begleitet. Allerdings können sie Entwickler durch starre Formate und Konventionen behindern. Einige kommerzielle Tools zwingen die Nutzer beispielsweise dazu, Tests über grafische Oberflächen zu erstellen. Um die richtige Entscheidung zu treffen, müssen Teams die Konformitätsbereitschaft, die Einfachheit der Testerstellung, den Integrationsaufwand und die langfristige Wartbarkeit gegeneinander abwägen. Die folgenden Kriterien zeigen auf, worauf bei der Auswahl eines Frameworks zu achten ist.

Sicherheitsstandards und Anforderungen für Tests auf Unit-Ebene

Unit-Testing-Tools müssen mehr als nur Tests ausführen. Sie müssen Nachweise, Traceability- und Abdeckungsdaten liefern, die belegen, dass das System die Sicherheitsziele erfüllt. Ein Standard-konformes Unit-Testing-Framework muss Folgendes unterstützen:

  • anforderungsbasiertes Testen, das die Verknüpfung jedes Tests mit spezifischen Anforderungen unterstützt,
  • Traceability-Reports: Berichte, die Anforderungen, Implementierung und Testergebnisse zur Nachweisführung der Konformität miteinander in Beziehung setzen,
  • Metriken zur strukturellen Abdeckung: Reports, die die Abdeckung des ausgeführten Codes dokumentieren, einschließlich Anweisungs-, Verzweigungs- und in vielen Fällen MC/DC-Abdeckung,
  • Fehlerinjektion und Zuverlässigkeitstests: Dabei wird überprüft, wie das System auf unerwartete Fehler reagiert, und es wird sichergestellt, dass es sicher ausfällt.

Typische Unit-Testing-Frameworks aus dem Open-Source-Bereich wie GoogleTest verfügen nicht über die oben genannten Funktionen, mit Ausnahme von Fault-Injection-Tests. Codeabdeckung und Traceability-Berichte sowie die zugehörigen Funktionen müssen mit externen Tools ergänzt werden.

Ein weiteres wichtiges Thema ist die Tool-Qualifizierung, die von allen Sicherheitsstandards vorgeschrieben wird. Wenn dieser Prozess für ein Open-Source-Tool manuell durchgeführt werden muss, ist das sehr zeitaufwändig. Viele kommerzielle Tools sind bereits zertifiziert, wodurch sich der Qualifizierungsaufwand vereinfacht. Es ist daher vorteilhaft, sich einen Überblick über die Qualifizierungsunterstützung der infrage kommenden Frameworks zu verschaffen.

Einfache Integration in Build- und CI/CD-Pipelines

In sicherheitskritischen Projekten muss sich das Unit-Testing-Framework nahtlos in moderne Build-Systeme und CI/CD-Pipelines integrieren lassen. Komplexe C++-Projekte stützen sich oft auf verteilte Builds mit Tools wie Bazel. Ein Framework, das sich nahtlos in diese Umgebungen einfügt, reduziert den Wartungsaufwand und beschleunigt die Feedback-Zyklen. In diesem Bereich sind Open-Source-Frameworks wie GoogleTest besonders leistungsfähig. Sie verfolgen einen schlanken, codezentrierten Ansatz, der proprietäre Formate vermeidet, was die Integration in bestehende Build- und CI-Automatisierungs-Workflows vereinfacht. Diese Flexibilität ist einer der Gründe, warum sich GoogleTest zum De-facto-Standard in der groß angelegten C++-Entwicklung, einschließlich ADAS- und autonomer Fahrprojekte, entwickelt hat.

Viele proprietäre bzw. kommerzielle Frameworks lassen sich dagegen nur schwer in komplexe Systeme integrieren. Sie speichern Testressourcen und Konfigurationen in verschiedenen Dateien und schreiben oft ihre eigene Vorgehensweise beim Erstellen der Testbinärdatei vor. Bei der Auswahl eines Frameworks für ein großes und komplexes Projekt, sollte man sich daher über die Kosten für die Build-Integration und die Integration in CI-Pipelines im Klaren sein.

Kosten für die Entwicklerschulung

Schulungskosten sind ein entscheidender Faktor bei der Auswahl eines Unit-Testing-Frameworks. Bei proprietären Lösungen müssen Teams oft herstellerspezifische APIs oder Formate erlernen, was die Einführung verlangsamen und die Einarbeitungskosten erhöhen kann. Das ist besonders wichtig, wenn das Framework für ein großes Unternehmen ausgewählt wird.

GoogleTest nutzt dagegen Standardkonstrukte von C++. Es ist vielen Entwicklern bereits vertraut – insbesondere in Unternehmen mit großen C++-Teams. Die Verwendung von GoogleTest bietet folgende Vorzüge, die bei kommerziellen Projekten mit strenger Überwachung von Produktivität und Kosteneffizienz zum Tragen kommen:

  • minimierte Einarbeitungszeit
  • verkürzte Anlaufzeit
  • niedrige Schulungskosten

Kosten für das Erstellen und die Pflege von Testfällen

Die Kosten für Unit-Tests entstehen oft weniger durch Tool-Lizenzen als durch den Aufwand für die Erstellung und Pflege von Testfällen. Proprietäre Frameworks bieten zwar möglicherweise eine automatisierte Testgenerierung, doch ihre starren APIs können das Schreiben und Aktualisieren von Tests für moderne C++-Codebasen erschweren.

Im Gegensatz dazu verwendet GoogleTest eine übersichtliche, C++-native API. Dadurch lassen sich komplexe Testszenarien leichter ausdrücken und pflegen. Dies reduziert den Aufwand und hilft Teams, mit sich weiterentwickelnden Codebasen Schritt zu halten – ein entscheidender Faktor in sicherheitskritischen Projekten.

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung

Kosten für die Migration bestehender Testfälle

Teams mit einer großen Anzahl bestehender Unit-Tests müssen beim Wechsel des Frameworks mit hohen Kosten rechnen. Proprietäre Tools basieren oft auf herstellerspezifischen Formaten oder Skriptsprachen. Das erschwert die Wiederverwendung bestehender Testfälle und verteuert sie. Wenn es in einem Projekt bereits eine umfangreiche Anzahl von GoogleTest-Fällen gibt, kann dies ein wichtiger Entscheidungsfaktor sein. Die Anpassung von GoogleTest an die Anforderungen von Sicherheitsstandards kann kostengünstiger sein als die Einführung eines neuen proprietären Frameworks und die Migration aller bestehenden Google-Tests in das neue Framework. Wurden bereits Testfälle mit einem proprietären/kommerziellen Framework erstellt und wird ein Tool-Wechsel in Betracht gezogen, kann die Migration der Tests in ein Framework, das reines C/C++ als Format verwendet – wie beispielsweise GoogleTest –, deutlich kostengünstiger sein als die Migration von Tests zwischen zwei verschiedenen proprietären Frameworks.

Bewertung von GoogleTest anhand von Auswahlkriterien

Die folgende Tabelle fasst die oben genannten Überlegungen zusammen und vergleicht GoogleTest mit einem typischen kommerziellen/proprietären Unit-Testing-Framework.

Kriterium GoogleTest mit C/C++test CT Typisches kommerzielles Framework
Anforderungsbasiertes Testen und
Berichterstellung zur Traceability
Vollständige Unterstützung,
einschließlich Traceabilty-
Reports und der Weitergabe von
Testergebnissen an RMS
Vollständige Unterstützung,
einschließlich Traceability-Reports
Unterstützung der Code Coverage Vollständig unterstützt Integriert und zertifiziert für den Einsatz
in sicherheitskritischen Anwendungen
Fault Injection Tests Möglich über GoogleMock Vollständig unterstützt und integriert
Tool Qualifizierung / Zertifizierung Mit TÜV-Zertifizierung
bereitsgestellt
Bereitgestellt, oft mit Zertifizierung
Integration in Build-Systeme und
CI/CD-Pipelines
Einfach und gut unterstützt Deutlich komplexer und
zeitaufwändiger
Kosten für das Erstellen und
Pflegen von Testfällen
Gering Höher, insbesondere bei komplexem
und vorlagenintensivem C++ Code
Automatische Generierung von
Testfällen
KI-gesteuert zur Schließung
von Abdeckungslücken
In der Regel unterstützt durch die
Generierung grundlegender Eingabe-/
Ausgabekombinationen
Kosten und Aufwand für die
Migration bestehender Tests
Gering Hoch

Auf den ersten Blick scheinen kommerzielle Frameworks für C-Projekte und kleinere C++-Systeme die bessere Lösung zu sein. Bei großen und komplexen C++-Projekten sieht die Situation jedoch anders aus. Die Herausforderungen bei der Integration und Automatisierung solcher Frameworks in moderne Build-Systeme sowie die höheren Kosten für die Testentwicklung können deren Vorteile schnell überwiegen. Es ist praktischer, GoogleTest um die fehlenden Funktionen zu erweitern und die Tool-Qualifizierung nach Bedarf durchzuführen, anstatt den laufenden Aufwand eines proprietären Frameworks mit nicht optimalen Testformaten und eingeschränkter Flexibilität für Entwickler zu tragen. Dieser Ansatz ist durch Parasoft C/C++test CT noch praktikabler geworden. Dieses Tool ergänzt GoogleTest um fehlende Funktionen und vereinfacht den Prozess der Tool-Qualifizierung für Sicherheitsstandards.

Wie hilft C/C++test CT?

C/C++test CT erweitert die Funktionen von GoogleTest und macht es zu einer umfassenden, sicheren Testlösung für die moderne C++-Entwicklung. Das Tool bietet folgende Vorteile:

  • Das in C/C++test CT integrierte, branchenweit erste TÜV-zertifizierte GoogleTest-Framework ist für die sicherheitskritische Entwicklung zugelassen und unterstützt Standards wie ISO 26262, IEC 61508, IEC 62304 und EN 50716.
  • Robuste Berichterstellung zur Anforderungsverfolgbarkeit.
  • Umfassende Überwachung der Codeabdeckung.
  • KI-gesteuerte Testgenerierung zur Beschleunigung und Verbesserung der Testerstellung.

Durch diese Zertifizierung entfällt die Notwendigkeit einer separaten Tool-Qualifizierung, wodurch sich die Konformität erheblich vereinfacht und der Verwaltungsaufwand verringert wird.

Die folgende Tabelle veranschaulicht, wie C/C++test CT mit GoogleTest eine vollständige und moderne Alternative zu herkömmlichen kommerziellen Frameworks für sicherheitskritische C++-Software bietet.

Kriterium GoogleTest mit   C/C++test CT Typisches   kommerzielles Framework
Anforderungsbasiertes   Testen und Berichterstellung zur Traceability Vollständige   Unterstützung, einschließlich Traceability-Reports und der Weitergabe von   Testergebnissen an RMS Vollständige   Unterstützung, einschließlich Traceability-Reports
Unterstützung der Code Coverage Vollständig   unterstützt Integriert   und zertifiziert für den Einsatz in sicherheitskritischen Anwendungen
Fault Injection Tests Möglich   über GoogleMock Vollständig   untersützt und integriert
Tool Qualifizierung / Zertifizierung Mit   TÜV-Zertifizierung bereitgestellt Bereitgestellt,   oft mit Zertifizierung
Integration in Build-Systeme und CI/CD-Pipelines Einfach   und gut unterstützt Deutlich   komplexer und zeitaufwändiger
Kosten für das Erstellen und Pflegen von Testfällen Gering Höher,   insbesondere bei komplexem und vorlagenintensivem C++-Code
Automatische Generierung von Testfällen KI-gesteuert   zur Schließung von Abdeckungslücken In   der Regel unterstützt durch die Generierung grundlegender Eingabe-/   Ausgabekombinationen
Kosten und Aufwand für die Migration bestehender Tests Gering Hoch

Für Teams, die moderne, groß angelegte C++-Anwendungen entwickeln, bietet C/C++test CT mit GoogleTest die ideale Balance zwischen Entwicklerproduktivität, Einhaltung von Sicherheitsstandards und einfacher Toolchain. Es verbindet die Flexibilität von Open-Source-Frameworks mit der Stringenz zertifizierter kommerzieller Lösungen und stellt somit eine technisch optimale und praktisch effiziente Lösung dar. Mit C/C++test CT müssen Sie sich nicht mehr zwischen Entwickleragilität und der Einhaltung von Sicherheitsvorschriften entscheiden. Sie erhalten beides.  (sg)

* Miroslaw Zielinski ist Director of Product Management bei Parasoft.

(ID:50840273)