Parasoft-Logo
Wie man Unit-Tests mit Codeabdeckung auf dem Zielsystem durchführt (Whitepaper-Titelbild)

Whitepaper

So führen Sie Unit-Tests mit zielgerichteter Codeabdeckung durch

Bevor Sie loslegen, sehen Sie sich unten eine Vorschau an.

Zum Abschnitt springen

Übersicht

Plattformübergreifendes Testen ermöglicht die Ausführung von Tests auf der Zielhardware mit nur geringfügigen oder gar keinen Änderungen an der Werkzeugschnittstelle oder deren Bedienung. „Ziel“ bezeichnet dabei entweder entfernt angeschlossene Hardware oder eine Simulation, die der Laufzeitumgebung des zu entwickelnden Produkts nachempfunden ist.

Zielumgebungen führen eingebettete Betriebssysteme auf Hardware aus, die hinsichtlich Speicher und Leistung stärker eingeschränkt ist als die Host-Entwicklungsumgebungen. Die Compiler-/Linker-/Debugger-Toolchain unterscheidet sich vom Zielprozessor.

Die Bedeutung zielgerichteter Tests

Zielbasiertes Testen, auch Integrationstest genannt, ist unerlässlich, um die korrekte Funktionalität, Sicherheit und Leistung eingebetteter Systeme zu validieren, da die Hostumgebung nicht über das eingebettete Betriebssystem, die Hardware-Schnittstellen und die Peripheriegeräte des Endprodukts verfügt. Darüber hinaus unterscheiden sich Leistung und Verhalten von Zielsystemen von der Hostumgebung und können die Testergebnisse beeinflussen.

Wesentliche Elemente des zielorientierten Testens eingebetteter Systeme

Softwareverifizierung und -validierung Das Testen ist ein integraler Bestandteil der Entwicklung eingebetteter Software. Es ist ein wichtiger Weg, um das korrekte Verhalten der Software nachzuweisen. Unit-Test Die Überprüfung dient der Verifizierung des Moduldesigns. Sie stellt sicher, dass jede Softwareeinheit ihre vorgesehene Funktion erfüllt.

Darüber hinaus können Sicherheitsanforderungen erfordern, dass sich Softwareeinheiten nicht unerwartet verhalten und nicht durch unerwartete Dateneingaben manipuliert werden können. Schwachstellen können im Zielsystem aufgrund von Verhaltensunterschieden zur Hostumgebung auftreten. Angriffsflächen für eingebettete Geräte lassen sich in Hostumgebungen nur schwer simulieren, und für aussagekräftige Tests ist die Zielhardware erforderlich.

Sammeln und analysieren Codeabdeckungsmetriken Die Codeabdeckung ist für sicherheitskritische Software von großer Bedeutung. Sie misst die Vollständigkeit der Testfälle und die Anzahl der ausgeführten Tests. Sie liefert den Nachweis, dass die Validierung abgeschlossen ist, zumindest gemäß den Vorgaben des Softwaredesigns.

Die Rückverfolgbarkeit zwischen Testfällen, Testergebnissen, Quellcode und Anforderungen muss dokumentiert und aufrechterhalten werden. Daher ist die Datenerfassung während zielorientierter Tests von entscheidender Bedeutung.

Das V-Modell der Softwareentwicklung zeigt die Beziehung zwischen jeder Phase und der in jeder Testphase abgeleiteten Validierung. Unit-Tests werden hervorgehoben, da dies das Thema dieser Seite ist.

Das V-Modell der Softwareentwicklung zeigt die Beziehung zwischen jeder Phase und der Validierung, die in jeder Testphase abgeleitet wurde.

Automatisierung zielbasierter Tests von eingebetteten Systemen

Automatisierung des Testens eingebetteter Systeme Die Komplexität der Initiierung und Überwachung von Tests auf eingebetteten Systemen stellt eine Herausforderung dar. Auch der eingeschränkte Zugriff auf die Zielhardware ist für Softwareteams eine Hürde. Dennoch ist Automatisierung unerlässlich, um kontinuierliches Testen eingebetteter Systeme vom Host-Entwicklungssystem bis zum Zielsystem zu gewährleisten.

Das Testen eingebetteter Software ist besonders zeitaufwändig. Die Automatisierung der Regressionstestsuite bietet erhebliche Zeit- und Kosteneinsparungen. Das Erfassen von Testergebnissen und Codeabdeckungsdaten vom Zielsystem ist für die Validierung und die Einhaltung von Normen unerlässlich. Die Zielhardware kann über eingeschränkte physische Verbindungen verfügen, was das Abrufen von Testergebnissen erschwert. Glücklicherweise lassen sich die Daten über verschiedene Schnittstellen wie serielle Schnittstellen, Ethernet (TCP/IP-Sockets), JTAG-Anschluss und andere Methoden extrahieren.

Durchführung von Unit-Tests und Codeabdeckung auf der Zielhardware

Das V-Modell der Softwareentwicklung zeigt die Beziehung zwischen jeder Phase und der Validierung, die in jeder Testphase abgeleitet wurde.

Plattformübergreifende Tests zur Verifizierung und Validierung auf Ziel- und Hostsystemen

Plattformübergreifendes Testen ermöglicht es, Tests auf dem Host – der Entwicklungsumgebung, in der die Tools installiert sind – zu generieren und zu erweitern und sie anschließend auf einem oder mehreren Zielsystemen auszuführen. Dies ist besonders nützlich für das Testen von Code, den Sie für die Verwendung auf einem eingebetteten Gerät oder einer anderen Plattform kompilieren.

Parasoft C / C ++ test Es beseitigt die Hürde für effektives Embedded-Testing, indem es automatisch Testfälle generiert, die in jeder plattformübergreifenden Situation – Host, Simulator und in den eigentlichen Zielumgebungen – ausgeführt werden können. Zudem lassen sich Testergebnisse und Codeabdeckungsmetriken erfassen. Die Instrumentierung erkennt Laufzeitfehler wie Speicherlecks in den laufenden Anwendungen.

Workflow zur Testgenerierung und -ausführung

In der Host-Umgebung können Entwickler automatisch einen Kernsatz von Unit- und API-Testfällen generieren, die unerwartete Funktionsreaktionen unter Grenzfallbedingungen identifizieren. Mit einer anderen Konfiguration erfassen die generierten Tests das aktuelle Softwareverhalten auf Methoden-/Funktionsebene. Die nächsten Schritte für diese Testsuite umfassen:

  1. Bei Bedarf für Funktionstests erweitern.
  2. Automatische Konfiguration für Regressionstests.
  3. Die Ausführung erfolgt auf dem Host, falls gewünscht, wobei die Zielabhängigkeiten automatisch durch konfigurierbare Stubs ersetzt werden.
Die Infografik zeigt, dass die Entwicklungsumgebung (Hostumgebung) alle Werkzeuge zur Erstellung einer Ziel-Executable enthält. Die Ziel-Executable übermittelt die Ergebnisse zurück an den Host.
Die Entwicklungsumgebung (Hostumgebung) verfügt über alle Werkzeuge, um eine Ziel-Executable zu erstellen. Die Ziel-Executable übermittelt die Ergebnisse zurück an den Host.

Dieselbe Testsuite wird anschließend cross-kompiliert, wodurch ausführbare Dateien für eine andere Prozessor- und Hardwareumgebung generiert werden, die in einer Zielumgebung ausgeführt werden. C/C++test speichert die Testergebnisse der Zielumgebung und verwendet sie später in der GUI zur Auswertung und Analyse. TCP/IP-Sockets können Testergebnisse automatisch an die C/C++test-GUI senden, die Abdeckungsmetriken erfasst, darunter die Abdeckung von Verzweigungen, einfachen Bedingungen und MC/DC für alle Tests. Die C/C++test-GUI bietet umfangreiche Funktionen zum Debuggen von Testfällen, darunter Unterstützung für viele Host-Debugger, Stack-Trace-Ausgabe, Ausgabe von Aufrufsequenzen und detaillierte Anzeige der Testfallergebnisse.

C/C++test und C/C++test CT können die Originalanwendung instrumentieren, um speicherbezogene Probleme zu erkennen. Anschließend wird sie auf dem Zielsystem kompiliert und ausgeführt, um vorhandene Speicherfehler zu identifizieren und die Codeabdeckung zu erfassen. Teams können diese Abdeckungsdaten mit denen anderer Unit-Tests auf dem Host- oder Zielsystem kombinieren.

Erstellen einer Test-Executable

Die Testdatei besteht aus einem Testframework, das auf instrumentiertem Quellcode und der C/C++-Laufzeitbibliothek basiert. Im Fall von Parasoft C/C++test wird eine vorkompilierte Version der C/C++test-Laufzeitbibliothek verwendet, die mit der C/C++test-Distribution ausgeliefert wird.

Für zielbasiertes Testen benötigen Teams eine crosskompilierte C/C++-Testlaufzeitbibliothek. C/C++test erstellt automatisch einen Build dieser Laufzeitbibliothek. In seltenen Fällen, die eine nicht standardmäßige Anpassung erfordern, kann die Laufzeitbibliothek auch manuell erstellt und der Quellcode des Test-Frameworks mithilfe eines Cross-Compilers kompiliert werden.

C/C++test automatisiert das Cross-Kompilieren des Test-Frameworks und dessen Verknüpfung mit der C/C++test-Laufzeitbibliothek. Dies setzt voraus, dass C/C++test den Cross-Compiler korrekt definiert. Hierfür ist keine Benutzerinteraktion erforderlich.

Infografik zur Veranschaulichung des Prozessablaufs für die Erstellung zielbasierter Testprogramme.
Der Prozessablauf zum Erstellen zielbasierter Testprogramme.

Die Parasoft C/C++Test-Laufzeitbibliothek

Laufzeitbibliotheken sind ein entscheidender Bestandteil zielbasierter Tests, da Tests eine geeignete Laufzeitumgebung für ihre Ausführung benötigen. Teams müssen die Laufzeitbibliothek mit einem Cross-Compiler und den entsprechenden Bibliotheken für die Ausführung, wie der Anwendung und den Testfällen, erstellen.

Parasoft C/C++test wird mit einer vorkompilierten, vollumfänglichen Laufzeitbibliothek ausgeliefert. Diese Laufzeitbibliothek ist jedoch für leistungsstarke Host-Plattformen konzipiert. Angesichts der Vielzahl an Embedded-Plattformen, auf denen Tests durchgeführt werden können, sowie deren jeweiligen Fähigkeiten und Einschränkungen, müssen Teams die Laufzeitbibliothek anpassen, bevor sie für verschiedene Embedded-Umgebungen kompiliert wird. Aus diesem Grund sind die reinen C-Quelltexte der Laufzeitbibliothek ebenfalls verfügbar.

Teams können die Bibliothek so konfigurieren, dass sie die auf der Zielplattform verfügbaren Funktionen unterstützt oder die nicht verfügbaren blockiert. Entwickler eingebetteter Systeme kennen die Vor- und Nachteile der von ihnen verwendeten Plattform(en) und sollten in der Lage sein, eine entsprechend konfigurierte Bibliothek zu erstellen und deren Pfad der Linker-Befehlszeile hinzuzufügen.

Arbeiten mit der C/C++test-Laufzeitbibliothek

Parasoft C/C++test erstellt die Laufzeitbibliothek automatisch im Rahmen der Testprogrammvorbereitungsphase. Das Teams-System benötigt eine benutzerdefinierte Version der C/C++test-Laufzeitbibliothek.

Die C/C++test-Laufzeitbibliothek wird als C-Quell- und Header-Datei bereitgestellt. In den meisten Fällen kann die Laufzeitbibliothek von C/C++test automatisch erstellt werden. Alternativ kann sie auch manuell mit dem Dienstprogramm `make` und einer der vorkonfigurierten `make`-Konfigurationen für die unterstützten Plattformen erstellt werden. C/C++test stellt spezielle Projektdateien bereit, die die Erstellung der Laufzeitbibliothek für gängige IDEs vereinfachen.

Zusammenfassung

Softwareverifizierung und -validierung sind ein wesentlicher Bestandteil der Entwicklung und des Testens eingebetteter Software. Komponententests sind notwendig, um sicherzustellen, dass jede Softwareeinheit ihre vorgesehene Funktion erfüllt. Die Automatisierung von Tests ist dabei ein wichtiger Aspekt. eingebettete Systeme ist aufgrund der Komplexität der Initiierung und Beobachtung von Tests auf eingebetteten Systemen eine größere Herausforderung.

Eingebettete Software nutzt plattformübergreifende Tests, um sowohl auf Host- als auch auf Zielsystemen zu testen. Zielsysteme sind hinsichtlich Speicher und Leistung stärker eingeschränkt als Hostsysteme, und die Compiler-/Linker-/Debugger-Toolchain unterscheidet sich wahrscheinlich von der des Zielprozessors.

Parasoft C/C++test unterstützt plattformübergreifendes Testen und ermöglicht die Testautomatisierung für zielbasiertes Testen. Dies trägt dazu bei, zielbasiertes Testen vorzuziehen und die Codeabdeckung zu erhöhen, während gleichzeitig komplexe zielbasierte Tests in CI/CD-Pipelines integriert werden.

Bereit, tiefer einzutauchen?

Laden Sie den WHS jetzt kostenlos herunter