Sehen Sie, welche API-Testlösung im GigaOm Radar Report am besten abgeschnitten hat. Holen Sie sich Ihren kostenlosen Analystenbericht >>

Sehen Sie, welche API-Testlösung im GigaOm Radar Report am besten abgeschnitten hat. Holen Sie sich Ihren kostenlosen Analystenbericht >>
Sammeln und analysieren Codeabdeckungsmetriken ist ein wichtiger Aspekt der sicherheitskritischen Softwareentwicklung. Die Codeabdeckung misst die Fertigstellung von Testfällen und ausgeführten Tests. Sie liefert den Nachweis, dass die Verifizierung abgeschlossen ist, zumindest wie im Softwaredesign angegeben. Zu den Zielen der Testabdeckungsanalyse gehört das Erreichen der folgenden Testabdeckungsziele:
Anforderungen auf hohem Niveau
Niedrige Anforderungen
Softwarestruktur nach den passenden Abdeckungskriterien
Softwarestruktur, sowohl Datenkopplung als auch Steuerungskopplung
Wie sich dies auf die Art und den Umfang der Abdeckung auswirkt, ist etwas auslegungsbedürftig. Bei der Entwicklung von Software für Flugzeuge liegt es jedoch in der Verantwortung des Herstellers, die Codeabdeckung zu planen, den Plan einzuhalten, zu dokumentieren und abzuschließen.
Im Folgenden sind die verschiedenen Arten der Codeabdeckung aufgeführt.
Erweitert Tools zur Automatisierung von Unit-Tests, wie Parasoft C/C++test, bieten all diese Code Coverage-Metriken und mehr. C/C++test CT automatisiert diese Datenerfassung auch bei Host- und Zieltests und sammelt im Laufe der Zeit den Test Coverage-Verlauf. Dieser Code Coverage-Verlauf kann Unit-, Integrations- und Systemtests umfassen, um sicherzustellen, dass die Abdeckung auf allen Testebenen vollständig und nachvollziehbar ist.
Die Ermittlung der Codeabdeckung durch Systemtests ist eine hervorragende Methode, um festzustellen, ob ausreichend Tests durchgeführt wurden. Der Ansatz besteht darin, alle Systemtests auszuführen und dann zu untersuchen, welche Teile des Codes nicht getestet wurden.
Der nicht ausgeführte Code weist darauf hin, dass möglicherweise neue Testfälle erforderlich sind, um den unberührten Code zu testen, in dem sich möglicherweise ein Defekt verbirgt. Dies trägt dazu bei, die Frage zu beantworten: Habe ich genügend Tests durchgeführt?
Wenn Teams Systemtests durchführen, liegt die durchschnittliche resultierende Metrik bei 60 % Abdeckung. Ein Großteil der 40 % nicht ausgeführten Codes ist auf defensiven Code in Ihrer Anwendung zurückzuführen. Defensiver Code wird nur ausgeführt, wenn das System einen Fehler auslöst oder in einen problematischen Zustand gerät, der möglicherweise schwer zu erzeugen ist. Es kann Wochen, Monate oder Jahre dauern, bis Zustände wie Speicherverlust oder andere Arten von Fehlern auftreten, die durch Hardwarefehler verursacht werden.
Es gibt auch defensiven Code, der von Ihren Codierungsrichtlinien vorgeschrieben ist und den Sie mit Systemtestfällen niemals ausführen können. Aus diesen Gründen können Sie mit Systemtests keine 100 % strukturelle Codeabdeckung erreichen. Sie müssen andere Testmethoden wie manuelle und/oder Unit-Tests anwenden, um 100 % zu erreichen.
Wie bereits erwähnt, können Unit-Tests als ergänzender Ansatz zu Systemtests verwendet werden, um eine 100-prozentige Abdeckung zu erreichen. Das Erreichen der Code-Abdeckung durch Unit-Tests ist eine der gängigeren Methoden, zeigt jedoch nicht, ob Sie das System ausreichend getestet haben, da der Fokus auf der Unit-Ebene (Funktion/Prozedur) liegt.
Das Ziel besteht hier darin, eine Reihe von Unit-Testfällen zu erstellen, die die gesamte Einheit mit der erforderlichen Abdeckung (Anweisung, Zweig und MC/DC) testen, um eine 100-prozentige Abdeckung für diese einzelne Einheit zu erreichen. Dies wird für jede Einheit wiederholt, bis die gesamte Codebasis abgedeckt ist. Um jedoch das Beste aus Unit-Tests herauszuholen, sollten Sie sich nicht nur auf die Codeabdeckung konzentrieren. Dies kann im Allgemeinen durch Testfälle für praxisnahe Szenarien erreicht werden.
Testen Sie das Gerät gründlich in allen möglichen Szenarien, um Robustheit, Sicherheit und die Rückverfolgbarkeit von Anforderungen auf niedriger Ebene sicherzustellen. Lassen Sie die Codeabdeckung ein Nebenprodukt Ihrer Testfälle sein und ergänzen Sie die Abdeckung, wo nötig.
Um die Codeabdeckung durch Unittests zu beschleunigen, stehen in Parasoft C/C++test konfigurierbare und automatisierte Testfallgenerierungsfunktionen zur Verfügung. Testfälle können automatisch generiert werden, um die Verwendung von Nullzeigern, Min-Mid-Max-Bereichen, Grenzwerten und vielem mehr zu testen. Diese Automatisierung kann Sie weit bringen. In wenigen Minuten erhalten Sie eine beträchtliche Codeabdeckung.
Darüber hinaus erweitert C/C++test CT Entwicklungs-Workflows mit Code Coverage durch die Integration mit proprietären Unit-Test-Frameworks und IDEs. Integrieren Sie Code Coverage-Zeilen, Anweisungen, einfache Bedingungen, Entscheidungen, Verzweigungen, Funktionen, Aufrufe und MC/DC eng mit proprietären Unit-Test-Frameworks wie GoogleTest und CppUnit und IDEs wie VS Code.
Wie beim Systemtest ist es jedoch aufgrund der Verwendung von defensivem Code oder formaler Sprachsemantik schwierig, eine 100%ige Codeabdeckung zu erreichen. Auf der granularen Ebene einer Einheit kann defensiver Code in Form einer Standardanweisung in einem Switch auftreten. Wenn jeder mögliche Fall in einem Switch erfasst wird, ist die Standardanweisung unerreichbar. Im folgenden Beispiel wird return 0; nie ausgeführt, da while (1) unendlich ist.
Diese Abdeckung, die durch manuelle/visuelle Inspektion und Berichte erreicht wird, kann verwendet werden, um die durch Unit-Tests erfasste Abdeckung zu ergänzen. Die Ergänzung beider Abdeckungsberichte kann verwendet werden, um 100% strukturelle Codeabdeckung nachweisen.
Das Ziel der Code-Abdeckung ist ein zusätzliches Mittel zur Gewährleistung der Sicherheit und Zuverlässigkeit des Codes.
Die Codeabdeckung wird meistens dadurch ermittelt, dass der Code instrumentiert wird. Instrumentiert bedeutet, dass der Benutzercode mit zusätzlichem Code versehen wird, um während der Ausführung festzustellen, ob diese Anweisung, dieser Zweig oder MC/CD ausgeführt wurde.
Basierend auf dem Ziel oder dem zu testenden System können die Abdeckungsdaten im Dateisystem gespeichert, in den Speicher geschrieben oder über verschiedene Kommunikationskanäle wie den seriellen Anschluss, den TCP/IP-Anschluss, USB und sogar JTAG gesendet werden.
Beachten Sie, dass die Code-Instrumentierung zu aufgeblähtem Code führt. Die Zunahme der Codegröße kann sich auf die Fähigkeit auswirken, den Code zum Testen auf speicherbeschränkte Zielhardware zu laden.
Die Problemumgehung besteht darin, einen Teil des Codes wie folgt zu instrumentieren:
Parasoft C/C++test schließt Abdeckungslücken in Testsuiten. Parasoft hat herausgefunden, wie man mithilfe erweiterter statischer Codeanalyse (Daten- und Kontrollflussanalyse) Werte für die Eingabeparameter findet, die zum Ausführen bestimmter Zeilen nicht abgedeckten Codes erforderlich sind.
In komplexem Code gibt es immer diese schwer fassbaren Codeanweisungen, für die es äußerst schwierig ist, eine Abdeckung zu erhalten. Es ist wahrscheinlich, dass es mehrere Eingabewerte mit verschiedenen Permutationen und möglichen Pfaden gibt, deren Entschlüsselung verwirrend und zeitaufwändig ist. Aber nur eine Kombination kann Ihnen die Abdeckung verschaffen, die Sie benötigen. Parasoft macht es einfach, eine Abdeckung dieser schwer erreichbaren Codezeilen zu erhalten.
Wenn Sie die Codezeile auswählen, die Sie abdecken möchten, teilt Ihnen der Coverage Advisor mit, welche Eingabewerte, globalen Variablen und externen Aufrufe Sie benötigen, um den Code zu stimulieren und eine Abdeckung zu erreichen.
Die Abbildung rechts zeigt einen Analysebericht, der dem Benutzer eine Lösung bietet. Das Feld „Voraussetzungen“ drückt Folgendes aus:
Beim Erstellen des Unit-Testfalls mit diesen festgelegten Parameterwerten und Stubs für externe Aufrufe erhalten Sie die Abdeckung der ausgewählten Zeile sowie der zusätzlichen Zeilen, die im Feld „Erwartete Abdeckung“ angegeben sind.
Für die strengsten sicherheitskritischen Anwendungen ist DO-178C Level A, Objektcodeabdeckung erforderlich. Daher muss eine Abdeckung auf Assembly-Ebene durchgeführt werden. Stellen Sie sich den Aufwand und die Arbeitskosten vor, die diese Aufgabe mit sich bringt. Glücklicherweise bietet Parasoft ASMTools eine automatisierte Lösung zum Erreichen der Objektcodeabdeckung.