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 >>
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.
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:
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.
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.
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 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 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.
Diese Tests bewerten die Menge an Arbeitsspeicher, Dateispeicherplatz, CPU-Ausführung oder anderen Zielhardwareressourcen, die von der Anwendung verwendet werden.
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.
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.
Automatisch generierte Testfälle, wie etwa heuristische Werte und Grenzwerte, nutzen Datenquellen, um in Tests ein breites Spektrum an Eingabewerten nutzen zu können.
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.
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.
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.
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:
VS-Code
Eclipse
Grüne Hügel Multi
Wind River Werkbank
IAR EW
ARM-MDK
ARM DS-5
TI-CCS
Visual Studio
Viel mehr
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.
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.