Das Testen von Software bindet viele Ressourcen. Durch die Integration von Prinzipien der datengetriebenen Entwicklung in Softwaretests lässt sich ein besonders gründlicher und effizienter Testprozess gewährleisten. Ein großer Vorteil insbesondere beim Test von Automotive-Software.
Wenn Softwareunternehmen einen datengetriebenen Entwicklungsprozess (DDD, Data-Driven Development) einführen, ist es entscheidend, dass sie für die speziellen Anforderungen der Branche relevante Leistungskennzahlen (KPIs, Key Performance Indicators) auswählen. Für Softwareentwickler und Projektleiter kann es wichtig sein, die Anzahl der umgesetzten Anforderungen pro Entwicklungszyklus und die Anzahl der pro Tag und Entwickler geschriebenen Codezeilen zu erfassen. Diese Metriken, oft als Velocity und Sprint Burndown bezeichnet, bieten wertvolle Einblicke in Arbeitskosten und Time-to-Market-Betrachtungen.
Weitere KPIs für die Softwareentwicklung können beispielsweise die Codekomplexität und die Codeausführungszeit der verwendeten Speicher sowie die Anzahl der Threads sein, die den Entwicklungsteams helfen, sich an geänderte Anforderungen anzupassen, Probleme zu priorisieren und hohe Risiken zuerst anzugehen.
Das Qualitätssicherungsteam kann beispielsweise KPIs wie die durchschnittliche Anzahl von Fehlern pro Codezeile erfassen. Die typische Kennzahl für Embedded-Software liegt bei 15 bis 50 Fehlern pro 1.000 Zeilen. Dies hilft bei der Identifizierung von Softwarefehlern und beantwortet wiederum die Frage: Soll die Anwendung implementiert oder ausgeliefert werden?
Eine Fehlerbeseitigungseffizienz (DRE, Defect Removal Efficiency), also ein Prozentsatz der beseitigten Fehler, von 85 % in einer normalen nicht sicherheitskritischen Anwendung wird als akzeptabel angesehen. Für eingebettete sicherheitskritische Softwareanwendungen liegt der akzeptable Bereich allerdings zwischen 95 % und 99 %. Kein Unternehmen erreicht 99,9 %, allerdings kommen Kunden, die in der ersten Testphase eine statische Analyse vornehmen, dann die wichtigsten Funktionen manuell verifizieren und anschließend eine Reihe von mehrstufigen Tests wie Unit-Tests, Integrationstests, Systemtests, Regressionstests und Code Coverage durchführen, auf DRE-Werte zwischen 95 % und 99 %. Diese Kunden berichten auch über geschäftliche Vorteile wie kürzere Entwicklungszeitpläne, weniger Projektausfälle, weniger Problemberichte vor Ort und niedrigere Arbeitskosten.
Viele Parasoft-Kunden aus der Automobilindustrie sammeln und analysieren Daten aus Aktivitäten wie Fahrzeugentwicklung, Simulationen und sogar Marktforschung. Die im Fahrzeug erhobenen Daten können aus vielen verschiedenen Systemen stammen, zum Beispiel aus Sicherheits- und Fahrerassistenzsystemen (ADAS, Advanced Driver Assistance Systems) und autonomen Fahrsystemen. Beispielsweise sind Fahrzeuge mit adaptiver Geschwindigkeitsregelung und Spurhalteassistenten ausgestattet, die Echtzeitdaten von Sensoren wie Radar, Lidar und Kameras sammeln. Darüber hinaus erfassen Telematiksysteme die Fahrzeugleistung, das Fahrerverhalten und verschiedene andere Aspekte im Zusammenhang mit dem Betrieb und der Nutzung des Fahrzeugs, darunter Motorleistung, Kraftstoffverbrauch, Emissionen, Geschwindigkeit, Batteriezustand, Beschleunigungs- und Bremsmuster, Unfallerkennung, Infotainment-Nutzung und Wartungsmeldungen.
Im weiteren Verlauf dienen die Daten zur Verbesserung von Softwaredesign, Softwaretests und deren Einsatz im Fahrzeug. Sie ermöglichen es den Automobilherstellern, innovativ zu sein, wettbewerbsfähig zu bleiben und die sich wandelnden Erwartungen der Verbraucher zu erfüllen. Damit kann sichergestellt werden, dass die Fahrzeugsoftware auf dem neuesten Stand und zuverlässig ist sowie sowohl die Sicherheit als auch das allgemeine Fahrerlebnis verbessert.
Diese realen Daten sind von unschätzbarem Wert für Softwareregressionstests, Performance-Tests, Fehlerbehandlung oder Fehlertoleranz, Sicherheitstests, Testfalldesign und vieles mehr. Sie stammen aus verschiedenen Quellen – Sensoren zur Simulation unterschiedlicher Betriebsbedingungen, Umgebungsfaktoren oder Benutzerinteraktionen – und dienen als Basis, um zu testen, wie sich die Software in verschiedenen Situationen verhält. Zusätzlich können Entwickler Testfälle erstellen, die von Datensätzen gesteuert werden, die in die zu testende Software eingegeben worden sind, anstatt Werte fest zu codieren. Dieser Ansatz ermöglicht es den Benutzern, denselben Test mit verschiedenen Datensätzen durchzuführen, um eine große Bandbreite von Szenarien abzudecken und Randbedingungen, Randfälle und Extremwerte zu untersuchen, die bei der manuellen Erstellung von Testfällen möglicherweise nicht offensichtlich sind.
Durch die Integration von Prinzipien der datengetriebenen Entwicklung in Softwaretests lässt sich ein gründlicherer und effizienterer Testprozess erstellen, der Fehler frühzeitig erkennt, die Robustheit der Software sicherstellt und qualitativ hochwertigere Softwarekomponenten für die Automobilindustrie liefert, die den Erwartungen entsprechen. Um das kontinuierliche Testen der Software bei der Einführung neuer Codeänderungen sicherzustellen, integrieren viele Unternehmen datengetriebene Tests in ihre CI/CD-Pipeline (Continuous Integration/Continuous Delivery).
Der typische Arbeitsablauf beginnt damit, dass die Entwickler einen Bereich erstellen, von dem aus sie arbeiten. Sie führen eine Pull-Anfrage aus, schreiben Code und nehmen Änderungen vor – mehrmals täglich. Ein Push oder Commit für die Codeänderung erzeugt einen Merge Request. Der Code wird in ein Repository wie Git übertragen, in der Regel innerhalb einer DevOps-Plattform wie GitLab.
Für jede Übertragung an den Entwickler führt GitLab eine Pipeline aus. Es generiert also den Code und führt automatisierte Testskripte für statische Analyse, Unit-Tests, Codeabdeckung usw. aus. Die Verwendung von Docker-Images trägt zur Vereinfachung der Pipeline bei. Unmittelbar nach der Codeüberprüfung erfolgt die Integration in den Hauptzweig. Wie bereits er- wähnt, sollte der erste Schritt die Integration der statischen Analyse in den CI/CD-Workflow sein. MISRA C 2023 und MISRA C++ 2023 sind die De-facto-Programmierstandards für C und C++. Um die zuverlässigste und sicherste Wahl zu treffen, lohnt es sich, die CERT-C- oder CERT-C++-Sicherheitsstandards zu berücksichtigen.
Andere gängige Code-Hosting-Plattformen wie GitHub können selbst gehostete Runner enthalten, zum Beispiel physische Server, virtuelle Maschinen oder Container-Images, die vor Ort oder in einer offenen Cloud wie Google Cloud ausgeführt werden. Die Integration von datengetriebenen Tests in die CI/CD- Pipeline gewährleistet die Bereitstellung von Software, die strenge Sicherheits- und Regulierungsanforderungen erfüllt und gleichzeitig mit den Ge- schäftszielen übereinstimmt.
Kontinuierliche Integration und Bereitstellung sind zum Standard in der Embedded-Entwicklung geworden. Die Umstellung von einem Wasserfallprozess auf CI/CD und agile Entwicklung bringt enorme Vorteile bei der Risikominderung und der Verbesserung von Qualität und Sicherheit mit sich. Embedded-Entwickler räumen der Sicherheit Priorität ein, und CI/CD erleichtert DevSecOps durch die Einbettung von Sicherheitsanforderungen und -kontrollen in die gesamte Pipeline.
Container sind von Natur aus CI/CD-kompatibel und unterstützen eine schnelle Bereitstellung und Portabilität über verschiedene Host-Umgebungen hinweg mit robuster Versionierung und zentraler Kontrolle. Durch die Bereitstellung einer reproduzierbaren Anwendungsumgebung mit integrierten Sicherheitskontrollen sind containerisierte Entwicklungsumgebungen unverzichtbar für die sichere Entwicklung innerhalb einer DevSecOps-Pipeline.
Da das Testen die meiste Zeit und meisten Ressourcen in Anspruch nimmt, ist kontinuierliches Testen in einer gut funktionierenden CI/CD-Pipeline entscheidend. Durch die Vorverlagerung des Testens in eine frühere Phase des Entwicklungslebenszyklus rationalisieren kontinuierliche Testframeworks die Prozesse. Die Automatisierung und Konzentration auf Risikobereiche machen das Testen zu einem weniger störenden Faktor in kontinuierlichen Prozessen.
Werkzeuge, die Automatisierung und Optimierung unterstützen, spielen dabei eine entscheidende Rolle. Sie sorgen für eine höhere Codeabdeckung, eine intelligente Testausführung und eine bidirektionale Rückverfolgbarkeit, was die Softwarequalität und -zuverlässigkeit weiter verbessert.
Der Autor
Richardo Camacho ist Director of Safety & Security Compliance bei Parasoft