Gehen Sie einen schnelleren, intelligenteren Weg zur KI-gestützten C/C++-Testautomatisierung. Erfahren Sie mehr >>
Whitepaper
Sie möchten sich vorab einen schnellen Überblick verschaffen? Dann beginnen Sie unten.
Teams, die sicherheitskritische C/C++-Anwendungen entwickeln, nutzen Unit-Testing-Frameworks, um die korrekte Implementierung und die Einhaltung der Softwareanforderungen sicherzustellen. Open-Source-Frameworks wie GoogleTest ermöglichen eine einfache Integration in komplexe Builds und entsprechen damit dem Branchentrend hin zu Open-Source-Lösungen.
Die Einführung von GoogleTest zur Einhaltung sicherheitskritischer Standards birgt jedoch zwei wesentliche Herausforderungen: die Erweiterung von GoogleTest um Funktionalitäten, die für die Einhaltung von Standards unerlässlich sind, und die Bewältigung des formalen Werkzeugqualifizierungsprozesses, der für die Entwicklung sicherheitskritischer Software erforderlich ist.
Sicherheitsstandards vermeiden bewusst eine starre Definition des Begriffs „Einheit“, da dieser von Technologie und Architektur abhängt. Aus Sicht der Konformität ist eine Einheit typischerweise die kleinste Architekturkomponente mit einer definierten Schnittstelle, die isoliert getestet werden kann.
Wichtige Standards wie ISO 26262 (Automobilindustrie) und DO-178C (Luftfahrt) strenges Mandat Tests auf Unit-Ebene, was einen gemeinsamen Satz von Verifizierungstechniken erfordert:
Um dem nachzukommen, Entwicklungspraktiken muss ein Unit-Testing-Framework beinhalten, Werkzeuge zur Abdeckungsüberwachung und Fehlereinspeisungund ein Berichtssystem, das Tests mit Anforderungen an die Rückverfolgbarkeit korreliert.
GoogleTest bietet umfangreiche Funktionen zur Definition von Testfällen und unterstützt verschiedene, von Normen geforderte Testquellenstrategien. ISO 26262 empfiehlt vier Methoden zur Ableitung von Testfällen: Anforderungsanalyse, Generierung und Analyse von Äquivalenzklassen, Grenzwertanalyse und Fehlervorhersage basierend auf Wissen und Erfahrung.
Kommerzielle Frameworks unterstützen typischerweise alle vier Methoden mit Automatisierung, erzwingen aber häufig proprietäre APIs, die vom Quellcode abstrahieren. Diese APIs erschweren die Testerstellung für modernes C++ und machen die Initialisierung von STL-Containern und Lambda-Eingaben extrem schwierig.
GoogleTest punktet mit Flexibilität und einer modernen C++-API zur Testerstellung, wodurch komplexe Datenstrukturszenarien einfacher und besser handhabbar werden. Testszenarien skalieren besser mit der Teamgröße und dem Testfallvolumen.
Werkzeugqualifizierung für sicherheitsrelevante GoogleTest-Anwendungen Erfordert besondere Aufmerksamkeit. Kommerzielle Frameworks sind mit Qualifizierungspaketen vorzertifiziert, die Open-Source-Community bietet jedoch keine derartige Unterstützung für GoogleTest.
Die Erfahrungen von Parasoft mit führenden Automobil- und Luftfahrtunternehmen zeigen, dass die Teams die Benutzerfreundlichkeit und die Klarheit der Tests von GoogleTest gegenüber den grundlegenden Generierungsfunktionen deutlich bevorzugen, insbesondere bei der Verwendung von Bazel-Buildsystemen.
Die Werkzeugqualifizierung ist ein formaler, durch Sicherheitsstandards vorgeschriebener Prozess, der sicherstellen soll, dass das Fehlerrisiko im Zusammenhang mit den Werkzeugen akzeptabel gering ist. Die Open-Source-Community bietet keine Unterstützung für die Qualifizierung von GoogleTest.
Der Qualifizierungsprozess muss die Klassifizierung und Validierung der Werkzeuge sowie die entsprechende Dokumentation umfassen. Das Dokumentationspaket enthält Richtlinien für den Einsatz in kritischen Entwicklungsumgebungen (Werkzeugsicherheitshandbuch/TSM).
Werkzeugklassifizierung Die Strenge der Qualifizierung wird anhand von Anwendungsfällen des Werkzeugs und zusätzlichen Maßnahmen bestimmt. Üblicherweise wird eine Werkzeugwirkungsanalyse durchgeführt – die Wahrscheinlichkeit, dass das Werkzeug einen Fehler verursacht oder einen Fehler nicht erkennt.
Unit-Test-Frameworks wie GoogleTest generieren keinen Code für das Zielsystem, wodurch die Möglichkeit, Fehler einzuführen, ausgeschlossen ist. Allerdings können sie Fehler nicht erkennen. Eine fehlerhafte Assertion kann dazu führen, dass ein fehlgeschlagener Test als bestanden gemeldet wird, was wiederum fehlerhaften Code im Produkt zur Folge hat.
ISO 26262 definiert drei Vertrauensstufen (TCL 1–3), wobei Stufe 3 die höchsten Qualifizierungsanforderungen stellt. DO-178C verwendet fünf Stufen (TQL 1–5). Frameworks für Komponententests werden typischerweise gemäß DO-178C als TQL 5 klassifiziert.
Die Werkzeugqualifizierung durch Validierung belegt, dass sich das Werkzeug wie in den Betriebsanforderungen beschrieben verhält und die Fehlerwahrscheinlichkeit akzeptabel niedrig ist. Zwei kritische Aspekte sind die Betriebsanforderungen an das Werkzeug und die Tests, die diese Anforderungen validieren.
Für die GoogleTest-Qualifizierung sind in beiden Bereichen erhebliche Investitionen erforderlich. GoogleTest bietet zwar eine gute Dokumentation, jedoch keine formalen Validierungsanforderungen. Organisationen müssen daher die entsprechende Dokumentation und Validierungstests selbst entwickeln.
Anforderungen spielen eine entscheidende Rolle in Sicherheitsprozessen, da sie präzise festlegen, was validiert wurde und sicher verwendet werden kann. Werkzeugdokumentationen können Anforderungen nicht ersetzen, da sie unterschiedliche Funktionen erfüllen.
Die Erfahrungen von Parasoft führten zu einem dreiphasigen Prozess:
Die Anforderungen wurden auf Basis der öffentlichen Dokumentation von GoogleTest entwickelt. Wo die Dokumentation nicht vollständig war, wurden zusätzliche Tests durchgeführt. Jede Anforderung wurde mit einem API-Element, dem Quellcode und der Benutzerdokumentation verknüpft, um die Wartung zu vereinfachen.
Die vollständige Analyse ergab Mehr als 1500 Anforderungen.
Empfehlungen:
Qualifizierungstestfälle müssen sich aus den Validierungsanforderungen ableiten. Vorhandene GoogleTest-Testfälle sind zwar von hoher Qualität, lassen sich aber aufgrund von Granularitätsunterschieden und unzureichenden Negativtests nur schwer direkt für die Qualifizierung einsetzen.
Die Erfahrung von Parasoft zeigt, dass die meisten Validierungstestfälle von Grund auf neu entwickelt wurden.
Eine zentrale Herausforderung bestand darin, eine Teststrategie für API-Aufrufketten zu entwickeln. GoogleTest ist ein vorlagenbasiertes Framework mit enormer Flexibilität. Ein vollständiges Testen aller möglichen API-Kombinationen ist jedoch unmöglich. Das GoogleTest-Mock-Makro EXPECT_CALL verdeutlicht diese Herausforderung: Es akzeptiert Parameter und kann mit Modifikatoren feinabgestimmt werden, was zu einer astronomischen Anzahl von Testfällen führt.
Ansatz mit allen Paaren: Bei langen Anrufketten stellt diese Methodik sicher, dass jede Kombination zweier verschiedener Modifikatoren mindestens einmal getestet wird, anstatt alle möglichen Kombinationen zu testen.
MC/DC-Abdeckungsstrategie: Angewendet auf Assertions/Expectations mit langen Aufrufketten. Die gesamte Aufrufkette wurde als Entscheidung mit jedem Modifikator als Bedingung behandelt. Die Tests konzentrierten sich darauf, nachzuweisen, dass jeder einzelne Modifikator das Ergebnis beeinflussen kann, während die anderen Modifikatoren unverändert bleiben.
Beide Strategien ermöglichten eine signifikante Reduzierung der Testfallzahlen für komplexe API-Aufrufe.
Für den Qualifizierungsprozess werden spezifische Dokumente benötigt, darunter Betriebsanforderungen, eine Erklärung zum Vertrauensniveau, ein Qualifizierungsplan, eine Matrix zur Abdeckung der Anforderungen und Richtlinien für die sichere Anwendung der Werkzeuge (Werkzeugsicherheitshandbuch/TSM).
Organisationen müssen die TSM-relevanten Richtlinien aus der GoogleTest-Dokumentation extrahieren und alle bekannten Fehler auf ihre Auswirkungen hin analysieren. Die Durchsetzung der TSM-Vorgaben ist aufwendig und erfordert in der Regel manuelle Arbeit. Parasoft hat statische Analyseregeln angewendet, um die Umsetzung vieler TSM-Empfehlungen zu automatisieren und so die Kosten deutlich zu senken.
Das Unit-Testing-Framework GoogleTest ist wahrscheinlich die beste Option zum Testen moderner C++-Anwendungen. Projekte, die Adaptive AUTOSAR oder ähnliche Plattformen nutzen, sowie solche, die auf modernen KI/ML-Bibliotheken für C++ basieren, wählen GoogleTest standardmäßig. Die zunehmende Nutzung von GoogleTest spiegelt einen starken Branchentrend hin zu Open-Source-Software für die Entwicklung von Sicherheitssystemen wider.
Bereitstellen GoogleTest für die Entwicklung sicherheitskritischer Software Es ist möglich. Allerdings sind erhebliche Anstrengungen und ein qualifiziertes Team erforderlich, um das Tool erfolgreich zu qualifizieren. Unternehmen müssen sich bewusst sein, dass die Qualifizierung von GoogleTest möglicherweise keine einmalige Angelegenheit ist. Mit den Weiterentwicklungen von modernem C++ und neuen Funktionen in nachfolgenden Versionen kann es vorkommen, dass Entwicklungsteams die Einführung neuerer Versionen fordern, was eine erneute Qualifizierung des Tools erforderlich macht.
Die Gesamtvorteile in Bezug auf Effizienz beim Softwaretest, geringeren Aufwand bei der Toolintegration, einfachere Entwicklung und Wartung von Testressourcen überwiegen jedoch die zusätzlichen Kosten im Zusammenhang mit der Einhaltung der Vorschriften.
Bereit, tiefer einzutauchen?
DATENBLATT
WEBINAR
29 min zusehen
BLOG
6 min gelesen