Logo für GIGAOM 365x70

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

DO-178C-Softwarekonformität für die Luft- und Raumfahrt sowie Verteidigung

Unit Tests

Die Softwareverifizierung ist ein wesentlicher Bestandteil der sicherheitskritischen Softwareentwicklung. Das Testen durch Ausführung ist ein wichtiger Weg, um die Umsetzung der Anforderungen und die Bereitstellung hochwertiger Software nachzuweisen. Unit-Test ist die Überprüfung von Anforderungen auf niedriger Ebene. Sie stellt sicher, dass jede Softwareeinheit das tut, was sie tun soll, und zwar im Rahmen der erwarteten Servicequalitätsanforderungen – Sicherheit, Schutz und Zuverlässigkeit. Sicherheitsanforderungen geben vor, dass sich Softwareeinheiten nicht auf unvorhergesehene Weise verhalten und das System nicht anfällig für Hijacking, Datenmanipulation, Diebstahl oder Beschädigung ist.

Diagramm des V-Modells in der Softwareentwicklung, das die Beziehung zwischen jeder Phase und der in jeder Testphase abgeleiteten Validierung zeigt.
Das V-Modell in der Softwareentwicklung zeigt die Beziehung zwischen jeder Phase und der Validierung, die in jeder Testphase abgeleitet wird.

Im Hinblick auf den klassischen V-Modell-Entwicklungsprozess ist die Ausführung von Unit-Tests eine Überprüfungspraxis, um sicherzustellen, dass das Modul richtig entworfen wurde. DO-178C schreibt Unit-Tests nicht ausdrücklich namentlich vor, sondern verwendet die Begriffe „High-Level- und Low-Level-Anforderungstests“.

Unter Low-Level-Tests versteht man im Allgemeinen Unit-Tests. Zu den Anforderungen an diese Art von anforderungsbasierten Tests gehören insbesondere die folgenden:

Symbol in einem blauen Kreis, das den weißen Umriss einer Richtlinien-Checkliste zeigt.

Softwaretests, Abschnitt 6.4

DO-178C beschreibt den Softwarevalidierungsprozess, der verschiedene Testaktivitäten umfasst, wie z. B. softwareanforderungsbasiertes Testen, Low-Level-Anforderungstesten und High-Level-Anforderungstesten. Unit-Tests werden normalerweise als Teil des Low-Level-Anforderungstests betrachtet, Abschnitt 0 c, bei dem einzelne Softwareeinheiten wie Funktionen, Prozeduren oder Methoden isoliert vom Rest des Systems getestet werden.

Im Folgenden sind die typischen Fehler aufgeführt, die bei Unit-Tests aufgedeckt werden.

  • Fehler eines Algorithmus bei der Erfüllung einer Softwareanforderung
  • Fehlerhafte Schleifenoperationen
  • Falsche logische Entscheidungen
  • Fehlerhafte Verarbeitung legitimer Kombinationen von Eingabebedingungen
  • Falsche Antworten auf fehlende oder beschädigte Eingabedaten
  • Falsche Behandlung von Ausnahmen, wie z. B. Rechenfehler oder Verletzungen von Array-Grenzen
  • Falsche Berechnungsreihenfolge
  • Unzureichende Präzision, Genauigkeit oder Leistung des Algorithmus
Symbol in einem blauen Kreis, das den weißen Umriss einer Richtlinien-Checkliste zeigt.

Softwareüberprüfung und Fall und Verfahren, Abschnitt 11.13

Detaillierte Angaben zu den Anforderungen für Verifizierungsfälle und -verfahren, einschließlich der für verschiedene Testaktivitäten (einschließlich Komponententests) verwendeten Testfälle.

Symbol in einem blauen Kreis, das den weißen Umriss einer Richtlinien-Checkliste zeigt.

Ergebnisse der Softwareüberprüfung, Abschnitt 11.14

Umfasst die Dokumentation und Aufzeichnung von Verifizierungsergebnissen, einschließlich der Ergebnisse von Unit-Test-Aktivitäten.

DO-178C schreibt keine spezifischen Testmethoden oder -werkzeuge vor, betont aber die Notwendigkeit gründlicher Tests, um die Sicherheit und Zuverlässigkeit von Bordsoftware zu gewährleisten. Tests müssen auf allen Ebenen des Systems durchgeführt werden, und es muss eine Rückverfolgbarkeit zwischen Anforderungen, Design, Quellcode und Tests gegeben sein. Darüber hinaus müssen Testpläne, Testfälle und Ergebnisse für die Zertifizierung dokumentiert werden.

Unit-Test-Methoden

Anforderungsbasierte Tests

Diese Tests testen direkt die Funktionalität und Servicequalität, wie in jeder Anforderung angegeben. Testautomatisierungstools müssen die bidirektionale Rückverfolgbarkeit von Anforderungen zu ihren Tests und den Berichten zur Anforderungstestabdeckung unterstützen, um die Konformität nachzuweisen.

Anforderungen auf hoher Ebene werden aus Systemanforderungen auf oberster Ebene abgeleitet. Sie zerlegen eine Systemanforderung in verschiedene funktionale und nicht funktionale Anforderungen auf hoher Ebene. Diese Phase der Anforderungszerlegung hilft bei der architektonischen Gestaltung des zu entwickelnden Systems.

Anforderungen auf hoher Ebene klären und helfen, das erwartete Verhalten sowie Sicherheitstoleranzen, Sicherheitserwartungen, Zuverlässigkeit, Leistung, Portabilität, Verfügbarkeit, Skalierbarkeit und mehr zu definieren. Jede Anforderung auf hoher Ebene ist mit der Systemanforderung verknüpft, die sie erfüllt. Darüber hinaus werden Testfälle auf hoher Ebene erstellt und mit jeder Anforderung auf hoher Ebene verknüpft, um sie zu verifizieren und zu validieren. Dieser Prozess der Softwareanforderungsanalyse wird fortgesetzt, während jede Anforderung auf hoher Ebene weiter in Anforderungen auf niedriger Ebene zerlegt wird.

Foto eines F35 Falcon Fighter, der auf der Seite vor einem klaren blauen Himmel fliegt.

Low-Level-Anforderungen sind Softwareanforderungen, die aus High-Level-Anforderungen abgeleitet werden. Sie zerlegen und verfeinern die Spezifikation des Verhaltens und der Servicequalität der Software weiter.

Diese Anforderungen gehen auf eine andere Abstraktionsebene. Sie werden einzelnen Softwareeinheiten zugeordnet und so geschrieben, dass sie die detaillierte Entwicklung und Implementierung der Software erleichtern. Die Rückverfolgbarkeit wird von jeder Anforderung auf niedriger Ebene bis zu ihrer Anforderung auf höherer Ebene und bis zu den Tests auf niedriger Ebene oder Unit-Testfällen gewährleistet, die sie überprüfen und validieren.

Beim Unit-Test geht es darum, die Funktion, Methode oder Prozedur zu isolieren. Dies geschieht durch Stubs und Mocking von Abhängigkeiten und das Erzwingen bestimmter Ausführungspfade. Stubs ersetzen den Code in der Unit, der von Code außerhalb der Unit abhängig ist. Sie bieten dem Entwickler oder Tester auch die Möglichkeit, die Antwort oder das Ergebnis zu manipulieren, sodass die Unit auf verschiedene Weise und für verschiedene Zwecke getestet werden kann, beispielsweise um sicherzustellen, dass die Unit zuverlässig funktioniert, sicher ist und auch keine Sicherheitslücken aufweist.

Schnittstellentests

Schnittstellentests stellen sicher, dass sich Programmierschnittstellen wie angegeben verhalten und funktionieren. Testtools müssen Funktionsstümpfe und Datenquellen erstellen, um das Verhalten externer Komponenten für die automatische Ausführung von Unittests zu emulieren.

Fehlerinjektionstests

Fehlerinjektionstests verwenden unerwartete Eingaben und führen Fehler bei der Ausführung des Codes ein, um die Fehlerbehandlung oder deren Fehlen zu untersuchen. Testautomatisierungstools müssen die Injektion von Fehlerbedingungen mithilfe von Funktionsstümpfen und die automatische Generierung von Unittests mithilfe eines vielfältigen Satzes von Vorbedingungen unterstützen, z. B. Mindest-, Mittel-, Höchst- und heuristische Werttests.

Auswertung der Ressourcennutzung

Diese Tests bewerten die Menge an Arbeitsspeicher, Dateispeicherplatz, CPU-Ausführung oder anderen Zielhardwareressourcen, die von der Anwendung verwendet werden.

Testfalltreiber

Analyse der Anforderungen

Natürlich erfordert jede Anforderung mindestens einen einzelnen Unit-Testfall. Obwohl Testautomatisierungstools Tests nicht direkt aus Anforderungen generieren, müssen sie die bidirektionale Rückverfolgbarkeit von Anforderungen zum Code und von Anforderungen zu Tests unterstützen und Informationen zu Anforderungen, Tests und Codeabdeckung pflegen.

Generierung und Analyse von Äquivalenzklassen

Testfälle müssen sicherstellen, dass sich Einheiten für eine Reihe von Eingaben auf die gleiche Weise verhalten, nicht nur für ausgewählte Eingaben für jede Einheit. Testautomatisierungstools müssen die Generierung von Testfällen mithilfe von Datenquellen unterstützen, um eine breite Palette von Eingabewerten effizient nutzen zu können. Parasoft C/C++test verwendet Factory-Funktionen, um Sätze von Eingabeparameterwerten für die automatisierte Generierung von Einheitentests vorzubereiten.

Analyse der Grenzwerte

Automatisch generierte Testfälle, wie etwa heuristische Werte und Grenzwerte, nutzen Datenquellen, um in Tests ein breites Spektrum an Eingabewerten nutzen zu können.

Fehler beim Schätzen

Die Methode zum Erraten von Fehlern verwendet den Funktionsstub-Mechanismus, um Fehlerbedingungen in die Ergebnisse der getesteten Codeflussanalyse einzufügen, und kann zum Schreiben zusätzlicher Tests verwendet werden.

Automatisierte Testausführung und Testfallgenerierung

Die Testautomatisierung bietet große Vorteile für sicherheitskritische eingebettete Gerätesoftware. Der Abschied von Testsuiten, die viele manuelle Eingriffe erfordern, bedeutet, dass Tests schneller, einfacher und häufiger durchgeführt werden können.

Durch das Auslagern dieses manuellen Testaufwands wird Zeit für eine bessere Testabdeckung und andere Sicherheits- und Qualitätsziele frei. Eine wichtige Voraussetzung für die automatisierte Ausführung von Testsuiten ist die Möglichkeit, diese Tests sowohl in Host- als auch in Zielumgebungen auszuführen.

Zielbasiertes Testen

Das Automatisieren von Tests eingebetteter Software ist aufgrund der Komplexität des Initiierens und Überwachens von Tests auf eingebetteten Zielen eine größere Herausforderung, ganz zu schweigen vom eingeschränkten Zugriff der Softwareteams auf die Zielhardware.

DO-178C erfordert das Testen von Software in einer repräsentativen Umgebung, die die tatsächlichen Einsatzbedingungen widerspiegelt. Dazu gehört das Testen auf der Zielhardware oder die Verwendung einer Softwareumgebung, die der endgültigen Zielumgebung sehr ähnlich ist. Dieser Ansatz ist erforderlich, um sicherzustellen, dass die Software im tatsächlichen Flugzeug oder Bordsystem korrekt und zuverlässig funktioniert.

Die Automatisierung von Softwaretests ist unerlässlich, um eingebettete Tests vom Host-Entwicklungssystem bis zum Zielsystem durchgängig durchführen zu können. Das Testen eingebetteter Software ist besonders zeitaufwändig. Die Automatisierung der Regressionstestsuite bietet erhebliche Zeit- und Kosteneinsparungen. Darüber hinaus C/C++test CT und C/C++test Führen Sie eine Code Coverage-Datenerfassung vom Zielsystem durch, die für die Validierung und die Einhaltung von Standards unerlässlich ist.

Die Rückverfolgbarkeit zwischen Testfällen, Testergebnissen, Quellcode und Anforderungen muss aufgezeichnet und aufrechterhalten werden. Aus diesen Gründen ist die Datenerfassung bei der Testausführung von entscheidender Bedeutung.

Der Parasoft C/C++test wird mit einem optimierten Test-Harness angeboten, der den zusätzlichen Aufwand für den binären Footprint auf ein Minimum reduziert und in Form eines Quellcodes bereitgestellt wird, der bei Bedarf plattformspezifischer Änderungen angepasst werden kann.

Links ist ein Bild eines Laptops, auf dem der Parasoft C/C++-Test angezeigt wird. Rechts ist die Zielhardware. Das Bild zeigt das Bereitstellen, Ausführen und Beobachten von Tests vom Host zum Ziel in Parasoft C/C++-Testlösungen.
Eine umfassende Ansicht der Bereitstellung, Ausführung und Beobachtung von Tests vom Host bis zum Ziel in Parasoft C/C++-Testlösungen.

Ein großer Vorteil der Parasoft C/C++-Testlösung ist die dedizierte Integration mit eingebetteten IDEs und Debuggern, die die Ausführung von Testfällen reibungslos und automatisiert machen. Zu den unterstützten IDE-Umgebungen gehören:

Logo für VS Code

VS-Code

Logo für Eclipse

Eclipse

Logo für Green Hills Software

Grüne Hügel Multi

Logo für Wind River

Wind River Werkbank

Logo für IAR

IAR EW

Logo für ARM

ARM-MDK

Logo für ARM

ARM DS-5

Logo für Texas Instruments

TI-CCS

Logo für Visual Studio

Visual Studio

Blauer Kreis mit einem weißen Pluszeichen-Symbol

Viel mehr

Automatisierte Testfallgenerierung

Tools zur Automatisierung von Unit-Tests unterstützen allgemein eine Art Test-Framework, das die Harness-Infrastruktur bereitstellt, um Units isoliert auszuführen und gleichzeitig Abhängigkeiten über Stubs zu erfüllen. Parasoft C/C++test ist da keine Ausnahme. Zu seinen Unit-Test-Funktionen gehört die automatische Generierung von Test-Harnesses und den ausführbaren Komponenten, die für host- und zielbasierte Tests erforderlich sind.

Screenshot, der den Parasoft C/C++test Test Case Explorer zeigt, insbesondere die automatische Testfallgenerierung. In diesem Fall eine Testsuite pro Funktion.
Automatisierte Testfallgenerierung mit Parasoft C/C++, in diesem Fall eine Testsuite pro Funktion

Die Generierung und Verwaltung von Testdaten ist bei weitem die größte Herausforderung beim Unit-Testing. Testfälle sind besonders wichtig bei der Entwicklung sicherheitskritischer Software, da sie funktionale Anforderungen sicherstellen und auf unvorhersehbares Verhalten sowie Sicherheits- und Schutzanforderungen testen müssen. Und das alles unter Einhaltung der Test-Coverage-Kriterien.

Parasoft C/C++test generiert automatisch Testfälle wie das beliebte CppUnit-Format. Standardmäßig generiert C/C++test eine Testsuite pro Quell-/Headerdatei. Es kann auch so konfiguriert werden, dass eine Testsuite pro Funktion oder eine Testsuite pro Quelldatei generiert wird.

Sichere Stub-Definitionen werden automatisch generiert, um „gefährliche“ Funktionen zu ersetzen, darunter System-E/A-Routinen wie rmdir(), remove(), rename() usw. Darüber hinaus können Stubs automatisch für fehlende Funktions- und Variablendefinitionen generiert werden. Benutzerdefinierte Stubs können nach Bedarf hinzugefügt werden.

Dunkelblaues Banner mit dem Bild eines Mannes, der in einem Serverraum mit einer Frau spricht, die ein Tablet in der Hand hält.
Bild eines Mannes und einer Frau mit einem Tablet in der Hand, die in einem Serverraum diskutieren.

Verbessern Sie Ihre Softwaretests mit Parasoft-Lösungen.