Tatsächlich sind die Aufwendungen für Software-Tests ein wichtiger Punkt. Laut Studien, wie dem World Quality Report (2021-2022) von Capgemini, können Tests 25 Prozent bis zu 50 Prozent der Entwicklungskosten ausmachen, speziell bei sicherheitskritischen Systemen. Dazu tragen Faktoren wie Mängel, ineffiziente manuelle Tests und langwierige On-Target-Hardwarevalidierung bei. Die Einhaltung von Standards (z. B. IEC 61508, ISO 26262, DO-178C) führt durch umfangreiche Tests, Dokumentation und Rückverfolgbarkeit zu einer erheblichen finanziellen Belastung.
Die Integration von Software und Hardware in Embedded-Systeme erhöht die Komplexität des Testens weiter, denn das Aufspüren von Fehlern aufgrund von zeitlichen Beschränkungen oder Echtzeit-Interaktionen zwischen Software und Hardware kann ressourcenintensiv sein. Herkömmliche Testmethoden verfehlen diese Probleme oft, was zu höheren Folgekosten führt.
Moderne Best Practices für Softwaretests überwinden nicht nur diese Herausforderungen, sondern tragen auch deutlich zur höheren Sicherheit und Zuverlässigkeit des Codes bei – ein entscheidender Faktor für Embedded-Echtzeitsysteme:
Statische Analyse
Diese Methode zur Fehlersuche und Identifizierung von Implementierungsproblemen prüft den Quellcode vor der Ausführung des Programms. Indem sie bereits in der Implementierungs- oder Codierungsphase erfolgt, ist sie ein Beispiel für den „Shift-Left“-Ansatz beim Softwaretesten, bei dem es um die frühzeitige Behebung von Fehlern und Codierungsproblemen im Entwicklungszyklus, bevor die Fehlerbehebung komplexer und kostspieliger wird, geht.
Bei sicherheitskritischen Systemen ist die statische Analyse entscheidend für die Einhaltung hoher Programmierstandards. Industriestandards für Sicherheitscodierung wie MISRA, AUTOSAR C++ 14, CERT und CWE unterstützen diese Anforderungen. Es ist wichtig, eine Lösung für die statische Analyse zu wählen, die diese Standards vollständig erfüllt und bei Bedarf benutzerdefinierte Regeln oder Ergänzungen berücksichtigt.
Zusätzlich bieten statische Analysewerkzeuge – im Gegensatz zu Unit-, Integrations- oder Systemtests – eine automatisierte, wiederholbare Prüfung, die keine Testfälle erfordert. Diese Automatisierung erleichtert häufige Überprüfungen und liefert wertvolle Informationen über die Codequalität, einschließlich Komplexität, Lesbarkeit, Testbarkeit und Wartbarkeit. Sie unterstützt Entwickler auch bei der Einführung besserer Programmierpraktiken und verbessert letztlich deren Fähigkeiten.
Automatisierte Tests und kontinuierliche Integration
Sie reduzieren den Zeit- und Ressourcenaufwand für manuelle Tests enorm. Automatisierte Werkzeuge ermöglichen konsistente, wiederholbare, jederzeit ausführbare Tests, und laufen oft über Nacht. So können Entwickler erkannte Probleme gleich am nächsten Morgen bearbeiten, was die Arbeitskosten senkt und den Testprozess beschleunigt. Dieser Ansatz funktioniert am besten, wenn er im CI (Continuous Integration)-Workflow eingebunden ist.
CI ist eine Softwareentwicklungspraxis, bei der Entwickler ihre Codeänderungen regelmäßig in einem gemeinsamen Repository sammeln. Nach jeder Änderung kompiliert ein automatisiertes System den Code, um erfolgreiche Builds zu gewährleisten. Dann führt die CI-Pipeline automatisierte Tests wie statische Analyse, Unit-Tests und Integrationstests durch, um sicherzustellen, dass sich der Code wie erwartet verhält und keine neuen Fehler entstehen. Dieser Prozess stellt sicher, dass sich die Änderungen nicht auf den Build auswirken und die Software in realen Umgebungen eingesetzt werden kann.
Automatisierte Tests laufen jedes Mal auf die gleiche Weise ab – das reduziert menschliche Fehler und erhöht die Genauigkeit. Zudem eignen sie sich ideal für Regressionstests indem sie sicherstellen, dass neue Codeänderungen keine Fehler in bereits funktionierende Funktionen einführen. Beide sind für die Sicherheit und für die kontinuierliche Optimierung von Embedded-Systemen entscheidend.
Unternehmen berichten von Einsparungen von 25 bis 30 Prozent bei den Arbeitskosten durch die Automatisierung von Tests und CI. Derzeit nutzen rund 53 Prozent der Softwareentwicklungsteams CI als Teil ihrer Prozesse. Obwohl CI immer häufiger in Verbindung mit automatisierten Tests zum Einsatz kommt, stecken viele Unternehmen noch in der Anfangsphase der vollständigen Automatisierung ihrer CI/CD-Pipelines, auch wenn die Vorteile wie höhere Produktqualität, Effizienz und kürzere Entwicklungszyklen, schwer wiegen.
Modellbasierte Tests
Damit können Teams reale Szenarien simulieren und Systeme unter vielen Bedingungen testen, was den Bedarf an teuren Hardwaresimulationen und teuren physischen Prototypen minimiert. In der modellbasierten Entwicklung ist ein Modell eine vereinfachte Darstellung eines Systems oder Prozesses, die verwendet wird, um sein Verhalten zu verstehen, zu analysieren oder vorherzusagen. Modelle können physisch sein, wie ein maßstabsgetreues Modell eines Gebäudes, oder abstrakt, wie mathematische Modelle oder Simulationen, die eine wertvolle Ergänzung zu realen Tests darstellen.
Andere Modelltypen, die in SysML, UML und Finite-State-Modellen enthalten sind, verbessern die Entwurfsgenauigkeit, optimieren die Entwicklung, bewältigen die Komplexität und gewährleisten die Konformität mit Industriestandards. Dies ist entscheidend für die effiziente Entwicklung qualitativ hochwertiger und zuverlässiger Embedded-Systeme. Modellbasiertes Testen baut auf diesen Vorteilen auf und verbessert die Abdeckung, Effizienz und Genauigkeit von Tests. Dieser Ansatz erhöht nicht nur die Qualität und Zuverlässigkeit der Software, sondern unterstützt auch schnellere und kostengünstigere Entwicklungszyklen.
KI-gesteuerte Testfallgenerierung
Insgesamt macht KI Softwaretests schneller und effizienter, indem sie repetitive Aufgaben automatisiert, die Testqualität verbessert und hilft, Änderungen effektiver zu verwalten.
Sie vereinfacht und beschleunigt den Testprozess und reduziert den manuellen Aufwand bei der Testerstellung und -pflege. Beispielsweise automatisiert eine hochentwickelte Softwaretestlösung, die künstliche Intelligenz (KI) einsetzt, die Erstellung von Unit-Tests, erhöht die Produktivität und verbessert die Testabdeckung. Erzielt wird dies durch die Integration in gängige integrierte Entwicklungsumgebungen (IDEs) und die Verwendung von sowohl proprietärer als auch offener KI-Technologien. Die KI überprüft die aktuelle Codeabdeckung, identifiziert Lücken und generiert schnell Unit-Tests, einschließlich der erforderlichen Mock-Objekte und Assertions. Sie passt auch bestehende Tests an, um die Gesamtabdeckung zu optimieren, und erstellt zusätzliche Tests, wenn neuer Code hinzugefügt wird, um neue Funktionen abzudecken. Dieser Ansatz reduziert die Gesamtzahl der notwendigen Testfälle und konzentriert den Testaufwand dort, wo er am effizientesten ist.
KI-gesteuerte Tests können auch in verschiedene Werkzeuge und Plattformen während des gesamten Testlebenszyklus integriert werden, einschließlich Testautomatisierungs-Frameworks, CI/CD-Pipelines und Testmanagementsystemen, zugunsten der Effizienz, Genauigkeit und Anpassbarkeit der Testgenerierung, -ausführung, -optimierung und -analyse.
Bei der statischen Analyse kann KI die Dinge erleichtern, indem sie den Code prüft und die wichtigsten Probleme priorisiert. Sie untersucht, wie der Code verwendet wird, und weist auf potenzielle Sicherheitsrisiken oder Qualitätsprobleme hin.
KI spielt zudem eine wichtige Rolle beim Testen von APIs (Application Programming Interfaces). Sie kann beim Erstellen von API-Tests unterstützen, die darauf basieren, wie Benutzer mit der Benutzeroberfläche (Unser Interface UI) interagieren, sodass keine Skripte von Hand geschrieben werden müssen. Auch für weniger technisch versierte Teams ist KI nützlich weil sie das Erstellen und Verwalten dieser Tests erleichtert.
Bei UI-Tests kann KI automatisch Probleme beheben, die bei Testlokalisierungen und Latenzzeiten auftreten, und Vorschläge zur Behebung machen. Zudem unterstützt KI bei der Service-Virtualisierung, indem sie verschiedene Bedingungen in der eigenen Testumgebung simuliert und so das Testen der Anwendung erleichtert, selbst wenn bestimmte Dienste oder Abhängigkeiten nicht verfügbar sind.
Das Beherrschen des Softwaretestens trägt entscheidend zur Gewährleistung von Sicherheit, Zuverlässigkeit und Konformität von Systemen in sicherheitskritischen Branchen bei. Trotz hoher Kosten und Komplexität bieten moderne bewährte Verfahren wie die statische Analyse, automatisierte Tests, modellbasierte Tests und KI-gesteuerte Ansätze enorme Vorteile. Durch die Integration dieser hochentwickelten Techniken in den Entwicklungslebenszyklus können Unternehmen Probleme frühzeitig angehen – sehr zum Vorteil der Testkosten insgesamt und der Codequalität. (neu)
Autor
Ricardo Camacho, Director of Safety & Security Compliance, Parasoft