Entdecken Sie das TÜV-zertifizierte GoogleTest mit Agentic AI für C/C++-Tests!
Details ansehen »
Zum Abschnitt springen
Parasoft-Blog
Lernen Sie, wie Sie robuste Testfälle erstellen, um eingebettete Systeme zu validieren und die Einhaltung von Sicherheitsstandards zu gewährleisten. Unser Leitfaden bietet praktische Methoden für Unit-, Integrations- und Systemtests, um die Qualität zu verbessern und die Entwicklung zu beschleunigen.
Zum Abschnitt springen
Das Schreiben effektiver Testfälle ist unerlässlich, um die Funktionalität eingebetteter Systeme zu validieren, Fehler frühzeitig zu erkennen und die Einhaltung von Sicherheitsstandards zu gewährleisten.
Dieser Leitfaden bietet praktische Hinweise zum Schreiben von Unit-Tests , Integrationstests und Systemtestfällen für eingebettete Systeme und hilft Ihnen so, die Softwarequalität zu verbessern und die Entwicklungszyklen zu beschleunigen.
Unit-Tests in eingebettetem C/C++ konzentrieren sich auf die isolierte Validierung einzelner Funktionen und Module. Effektive Unit-Testfälle folgen einer einheitlichen Struktur:
Umfassende Unit-Tests für eingebetteten Code zu schreiben, müssen Hardwareabhängigkeiten mithilfe von Mocking- und Stubbing-Techniken berücksichtigt werden. Beim Testen von GPIO-Steuerungsfunktionen, Sensormessroutinen oder Datenverarbeitungsalgorithmen sollten Hardwareinteraktionen isoliert werden, um Tests ohne physische Geräte zu ermöglichen.
Lösungen für das Testen eingebetteter Software bieten spezielle Funktionen für den effektiven Umgang mit diesen Hardwareabstraktionen. Da viele eingebettete Systeme sicherheitskritisch sind, müssen diese strengen Tests die funktionalen Anforderungen und die Anforderungen an die Dienstgüte, wie z. B. Timing, Zuverlässigkeit und Ressourcennutzung, überprüfen.
Eine gut organisierte Testfallstruktur verbessert die Wartbarkeit.
Fassen Sie zusammengehörige Testfälle in Testsuiten zusammen, verwenden Sie aussagekräftige Namenskonventionen, die klar angeben, was getestet wird, und strukturieren Sie Assertions, um sowohl die funktionale Korrektheit als auch Grenzfälle zu validieren. Erstellen Sie beispielsweise beim Testen einer Temperaturumrechnungsfunktion separate Testfälle für Normalbereiche, Grenzwerte und Fehlerzustände.
Zu den spezifischen Herausforderungen eingebetteter Systeme gehören Speicherbeschränkungen und Echtzeit-Timing-Anforderungen. Daher müssen Testfälle entwickelt werden, die innerhalb des vorgegebenen Speicherbudgets liegen und sicherstellen, dass zeitkritische Operationen die Fristen einhalten.
Das Testen von Interrupt-Handlern und parallelen Operationen erfordert besondere Aufmerksamkeit, um Thread-Sicherheit und korrekte Synchronisierung zu gewährleisten. Automatisierte Tests für eingebettete Systeme tragen durch intelligente Testgenerierung und -ausführung dazu bei, diese Herausforderungen zu bewältigen.
Große Sprachmodelle wie ChatGPT beschleunigen die Erstellung von Unit-Tests, indem sie Testcode generieren, Szenarien vorschlagen und potenzielle Grenzfälle identifizieren. Bei eingebettetem C und C++ kann es jedoch vorkommen, dass KI-generierte Tests wichtige Kontextinformationen zu Hardwareabhängigkeiten, Echtzeitbeschränkungen, Plattform-APIs, Anforderungen sowie Sicherheitsaspekten vermissen lassen.
Die generierten Tests müssen noch von Ingenieuren geprüft und verifiziert werden.
Parasoft kombiniert etablierte Softwareverifizierungsfunktionen mit KI im Bereich des Embedded-Software-Testings , um die Produktivität zu steigern und gleichzeitig die Testqualität durch menschliche Aufsicht und eingebettetes Domänenwissen aufrechtzuerhalten.
Parasoft C/C++test zur automatisierten Testgenerierung verwendet statische Analyse zur Identifizierung von:
KI-gestützte Fehlerbehebung hilft Entwicklern, die Ergebnisse zu verstehen und Lösungsvorschläge zu generieren.
Darüber hinaus hilft die KI-gestützte Erstellung von Unit-Tests den Entwicklern beim Erstellen von Tests und der Verbesserung der Testabdeckung.
Für Teams, die bestehende C- und C++-Testframeworks wie GoogleTest verwenden, erweitert C/C++test CT die KI-Unterstützung auf die Abdeckungsanalyse. KI-gestützte Workflows analysieren Abdeckungslücken, einschließlich MC/DC, und helfen dabei, zusätzliche Testbedingungen zu identifizieren, die erforderlich sind, um fehlende Pfade abzudecken.
Die Integration des Model Context Protocol (MCP) verbindet KI-Assistenten und -Agenten mit den Verifizierungsfunktionen und -daten von Parasoft und ermöglicht so den Zugriff auf projektspezifische Analyse-, Test- und Abdeckungsinformationen.
Erfahren Sie mehr darüber, wie MCP-Server die agentenbasierte Entwicklung für fortschrittliche KI-gestützte Testabläufe unterstützen.
KI unterstützt. Sie ersetzt aber nicht den Verifizierungsprozess.
KI hilft Ingenieuren, schneller auf diese Erkenntnisse zu reagieren und gleichzeitig die Kontrolle über die Ergebnisse zu behalten.
Effektives eingebettetes Testfalldesign folgt fundamentalen Prinzipien, die den besonderen Herausforderungen ressourcenbeschränkter, sicherheitskritischer Systeme gerecht werden.
Zu den wichtigsten Grundsätzen gehören:
Spezifische Anforderungen an eingebettete Systeme prägen die Gestaltung der Testfälle.
Schaffen Sie eine solide Grundlage mit zahlreichen Unit-Tests, die einzelne Funktionen schnell und gründlich validieren. Ergänzen Sie diese durch Integrationstests, die Komponenteninteraktionen und Schnittstellen überprüfen. Ergänzen Sie die Verifizierung und Validierung durch gezielte Systemtests, die das End-to-End-Verhalten in realistischen Szenarien validieren. Dieser ausgewogene Ansatz maximiert die Fehlererkennung bei gleichzeitiger Aufrechterhaltung der Testeffizienz.
Automatisierte Tests für eingebettete Systeme und Software-Konformitätsprüfungsmethoden tragen dazu bei, diese Prinzipien im gesamten Entwicklungslebenszyklus effektiv umzusetzen.
Anforderungsbasiertes Testfalldesign leitet Testfälle direkt aus System- und Softwareanforderungen ab und gewährleistet so eine umfassende Validierung des spezifizierten Verhaltens.
Analysieren Sie Anforderungsdokumente, um testbare Bedingungen zu identifizieren, erstellen Sie Testfälle, die jede Anforderung validieren, und stellen Sie eine bidirektionale Rückverfolgbarkeit zwischen Anforderungen und Tests her, um eine vollständige Abdeckung nachzuweisen.
Schreiben Sie Testfälle, die sowohl funktionale Anforderungen (was das System tun soll) als auch nichtfunktionale Anforderungen (Leistung, Zeitmessung, Ressourcennutzung) überprüfen.
Für die funktionalen Anforderungen sollten positive Testfälle erstellt werden, die das erwartete Verhalten unter normalen Bedingungen validieren, sowie negative Testfälle, die die ordnungsgemäße Fehlerbehandlung, die Eingabevalidierung und das Management von Randbedingungen überprüfen.
Die Kennzahlen zur Abdeckung der Anforderungen gewährleisten gründliche Tests.
Dieser systematische Ansatz verringert das Risiko, dass wichtige Funktionen übersehen werden, und unterstützt die Einhaltung von Sicherheitsstandards.
Lösungen zur Rückverfolgbarkeit von Anforderungen ermöglichen die automatisierte Nachverfolgung zwischen Anforderungen und Testfällen, was für regulierte Branchen wie Medizin, Eisenbahn, Energie und andere unerlässlich ist.
Bei Luftfahrtsoftware gewährleistet die anforderungsbasierte Prüfung gemäß DO-178C die vollständige Abdeckung der Lufttüchtigkeitsanforderungen. Ebenso unterstützt die anforderungsbasierte Prüfung gemäß ISO 26262 die Validierung der funktionalen Sicherheit in der Automobilindustrie.
Randwertanalyse und Äquivalenzzerlegung sind systematische Techniken zur Entwicklung effizienter Testfälle, die die Fehlererkennung maximieren.
Ermitteln Sie die Eingabegrenzen (Minimalwerte, Maximalwerte, Grenzwerte), bei denen Fehler am häufigsten auftreten, und erstellen Sie Testfälle, die diese Grenzen zusammen mit repräsentativen Werten aus gültigen Bereichen testen.
Äquivalenzklassen gruppieren ähnliche Eingaben, die ein ähnliches Verhalten hervorrufen sollten. Wählen Sie repräsentative Testfälle aus jeder Äquivalenzklasse aus, anstatt jeden möglichen Eingabewert erschöpfend zu testen. Dieser Ansatz gewährleistet eine umfassende Testabdeckung bei gleichzeitig praktikablen Testlaufzeiten.
Eingebettete Systeme stellen spezifische Grenzfälle dar:
Wenden Sie diese Techniken auch auf die Ausgabeprüfung an. Wenn eine Funktion berechnete Ergebnisse liefert, überprüfen Sie die Ausgaben an den erwarteten Grenzen und stellen Sie sicher, dass das Verhalten korrekt ist, wenn sich die Ausgaben den Grenzwerten nähern. Die statische Codeanalyse zur Grenzwertprüfung kann potenzielle grenzbezogene Fehler vor der Testausführung identifizieren.
Metriken zur Codeabdeckung messen die Vollständigkeit der Testfälle und identifizieren Lücken im Testprozess.
Eingebettete Systeme erfordern die Abdeckung durch spezialisierten Code.
Diese oft übersehenen Codepfade sind entscheidend für die Zuverlässigkeit eingebetteter Systeme.
Die Abdeckungsziele variieren je nach Kritikalitätsgrad. Sicherheitskritische Funktionen erfordern möglicherweise eine 100%ige Abdeckung von Anweisungen und Zweigen mit vollständiger MC/DC (modifizierte Zustands-/Entscheidungsabdeckung) für die Zertifizierung.
Für weniger kritische Funktionen können niedrigere Deckungsschwellenwerte akzeptiert werden. Legen Sie angemessene Ziele auf Grundlage der Risikobewertung und der regulatorischen Anforderungen fest.
Erfahren Sie mehr darüber, wie Sie eine 100%ige Abdeckung der Bauvorschriften für sicherheitskritische Systeme erreichen können.
Die Abdeckungsberichte dienen als Grundlage für die Erstellung von Testfällen. Überprüfen Sie den nicht abgedeckten Code, um festzustellen, ob zusätzliche Testfälle erforderlich sind oder ob unerreichbarer defensiver Code gerechtfertigt werden kann.
Priorisieren Sie die Erstellung von Testfällen für nicht abgedeckte kritische Pfade gegenüber dem umfassenden Testen weniger wichtigen Codes. Lösungen zur Codeabdeckung für eingebettete Systeme bieten detaillierte Analysen und Berichte, während die Messung von Codeabdeckungsmetriken hilft, den Testfortschritt zu verfolgen und Lücken zu identifizieren.
Das Testen eingebetteter Systeme durchläuft verschiedene Stufen, von denen jede einen spezifischen Umfang und spezifische Ziele hat.
Die Testfälle unterscheiden sich je nach Detaillierungsgrad und Fokus.
Der Übergang von Einzelteil- zu Systemtests ermöglicht eine mehrstufige Validierung.
Dieser stufenweise Ansatz verbessert die Effizienz, indem verschiedene Fehlertypen auf der jeweils geeigneten Ebene erkannt werden.
Das Verständnis von Testmethoden zur Sicherstellung der Softwarekonformität hilft bei der Auswahl des richtigen Testansatzes für jede Testebene. Darüber hinaus gewährleisten Regressionsteststrategien, dass Änderungen die bestehende Funktionalität auf allen Testebenen nicht beeinträchtigen.
Unit-Testfälle validieren einzelne C/C++-Funktionen und -Module isoliert. Jeder Testfall sollte klar strukturiert sein mit Setup-, Ausführungs-, Assertions- und Teardown-Phasen.
Das Setup initialisiert Variablen, bereitet Testdaten vor und konfiguriert Simulationen für Hardwareabhängigkeiten. Bei eingebettetem Code, der auf GPIO-Pins oder Sensoren zugreift, werden diese Hardwareinteraktionen simuliert, um Tests ohne physische Geräte zu ermöglichen.
Die Ausführung ruft die zu testende Funktion mit spezifischen Eingaben auf. Konzentrieren Sie sich in der Ausführungsphase darauf, pro Testfall jeweils einen einzelnen Aspekt der Funktionalität zu testen.
Assertions überprüfen erwartete Ausgaben, Seiteneffekte und Zustandsänderungen. Prüfen Sie Rückgabewerte, validieren Sie geänderte Variablen und bestätigen Sie, dass simulierte Funktionen korrekt aufgerufen wurden. Schreiben Sie Assertions, die klar angeben, was fehlgeschlagen ist, wenn Tests nicht erfolgreich sind.
Das Teardown gibt Ressourcen frei, setzt den globalen Zustand zurück und gewährleistet die Isolation der Tests. Eine ordnungsgemäße Bereinigung verhindert, dass sich Testfälle gegenseitig beeinträchtigen. Die Einhaltung bewährter Methoden für Unit-Tests gewährleistet konsistente und wartungsfreundliche Testsuiten.
Automatisierte Unit-Tests mit C/C++test vereinfachen die Erstellung und Ausführung von Testfällen, während die Codeabdeckungsanalyse Einblick in die validierten Codepfade bietet.
Integrationstestfälle validieren die Interaktionen zwischen Komponenten in eingebetteten Systemen. Der Fokus liegt auf dem Testen von Schnittstellen zwischen Softwaremodulen, Hardware-Software-Integrationspunkten, Kommunikationsprotokollen und Subsysteminteraktionen.
Entwerfen Sie Testfälle, die den Datenfluss über Komponentengrenzen hinweg überprüfen. Validieren Sie, dass die zwischen Modulen ausgetauschten Daten Integrität und korrektes Format beibehalten. Testen Sie die API-Nutzung, um sicherzustellen, dass Komponenten Schnittstellen korrekt verwenden und Rückgabewerte ordnungsgemäß verarbeiten.
Timing und Synchronisierung sind bei Integrationstests eingebetteter Systeme entscheidend. Überprüfen Sie die korrekte Synchronisierung der Komponenten, insbesondere in Multithread- oder interruptgesteuerten Architekturen. Testen Sie die Nachrichtenübermittlung und Ereignisbehandlung zwischen den Komponenten, um die korrekte Reihenfolge sicherzustellen.
Die Fehlerfortpflanzung erfordert besondere Aufmerksamkeit. Stellen Sie sicher, dass Fehler, die in einer Komponente erkannt werden, korrekt an abhängige Komponenten weitergegeben werden und dass Systeme Fehlerzustände ordnungsgemäß behandeln, ohne dass es zu Kaskadenausfällen kommt. Der Einsatz von Stubs in Integrationstests hilft, Komponenten zu isolieren und verschiedene Integrationsszenarien zu simulieren.
Für regulierte Branchen sind spezifische Integrationstestverfahren unerlässlich. Integrationstests nach DO-178C erfüllen die Softwareanforderungen für die Luftfahrt, während Integrationstests nach ISO 26262 die Einhaltung der funktionalen Sicherheitsstandards für die Automobilindustrie gewährleisten.
Systemweite Testfälle validieren das vollständige Verhalten eingebetteter Systeme in simulierten oder realistischen Betriebsszenarien. Entwerfen Sie umfassende Testfälle, die die Systemanforderungen verifizieren, Anwendungsfälle und Benutzerszenarien validieren und die End-to-End-Funktionalität bestätigen.
Vollständige Workflow-Tests validieren ganze Abläufe. Testen Sie die Startprozeduren vom Einschalten über die Initialisierung bis zum Betriebszustand. Überprüfen Sie den normalen Betrieb unter typischen Nutzungsbedingungen. Validieren Sie die Abläufe für Herunterfahren und Energiemanagement.
Die Leistungsanforderungen auf Systemebene müssen gründlich validiert werden:
Sicherheitskritische Szenarien erfordern eine sorgfältige Testfallentwicklung. Überprüfen Sie, ob Fehlererkennungsmechanismen korrekt auslösen. Testen Sie, ob Fehlerbehebungsverfahren die Systemfunktionalität wiederherstellen. Stellen Sie sicher, dass ausfallsichere Verhaltensweisen bei kritischen Fehlern aktiviert werden. Bestätigen Sie die ordnungsgemäße Funktion von Überwachungstimern und Systemüberwachung.
Die Integration von Systemtests in Continuous-Delivery-Pipelines beschleunigt das Feedback. CI/CD-Testautomatisierung für eingebettete Systeme ermöglicht häufige Validierungen, während die Implementierung von Qualitätssicherung in CI/CD-Pipelines sicherstellt, dass Qualitätsprüfungen Probleme vor der Bereitstellung erkennen. Die Gewährleistung der Rückverfolgbarkeit von Anforderungen von Systemtests zurück zu den Anforderungen demonstriert eine vollständige Validierungsabdeckung.
Eine effektive Testfallentwicklung ist grundlegend für die Qualität eingebetteter Systeme. Dieser Leitfaden behandelt das Schreiben von Unit-Testfällen in eingebettetem C/C++, Prinzipien effektiven Testfalldesigns (anforderungsbasierte, Grenzwert-, Äquivalenzklassen- und abdeckungsgetriebene Ansätze) sowie Strategien zum Schreiben von Testfällen auf verschiedenen Ebenen (Unit-, Integrations- und Systemtests).
Parasoft bietet umfassende Lösungen für die Entwicklung und Ausführung von Testfällen in eingebetteten Systemen. Parasoft C/C++test bietet automatisierte Testgenerierung, Unit-Tests und Codeabdeckungsanalyse speziell für eingebettete C/C++-Anwendungen und unterstützt Teams dabei, …
KI fügt den etablierten Verifizierungsfunktionen eine weitere Ebene der Automatisierung hinzu, von der unterstützten Fehlerbehebung und der Erstellung von Unit-Tests bis hin zur Abdeckungsanalyse und MCP-Integration.
Statische Analyse, Testausführung, Abdeckungsanalyse und Anforderungsrückverfolgbarkeit bleiben jedoch die objektive Grundlage der Verifikation. KI unterstützt Ingenieure dabei, schneller auf diese Ergebnisse zu reagieren, ohne den Verifikationsprozess selbst zu ersetzen.
Die Embedded-Testing-Lösungen von Parasoft unterstützen den gesamten Testlebenszyklus von der statischen Analyse und der Erstellung von Testfällen über die Ausführung, die Codeabdeckung und die Rückverfolgbarkeit von Anforderungen bis hin zur Berichterstellung.
Automatisierte Testlösungen helfen Teams, wiederkehrende manuelle Arbeiten zu reduzieren, die Testabdeckung zu verbessern und zuverlässige eingebettete Systeme mit Zuversicht bereitzustellen.
Sind Sie bereit, Ihre Embedded-Tests zu verbessern?
Weiterführende Inhalte