Wenn die Steuerungssoftware im Pkw bockt, sind die Kunden im günstigsten Fall nur sauer, weil beispielsweise eine Funktion nicht zur Verfügung steht. Im fließenden Verkehr können jedoch bei Pkw ebenso wie beim Bewegen von schweren Bau- und Landmaschinen auftretende Softwarefehler schnell zur Gefahr für Leib und Leben werden. Angesichts komplexer werdender Steuerungssoftware wird es immer schwieriger, die Code-Qualität hoch zu halten, insbesondere bei Projekten in der Programmiersprache C. Mit einer eigenen Testumgebung bietet EDAG eine Lösung, die Zeit und Ressourcen schont.
Je mehr Funktionen in Software abgebildet werden, je mehr Assistenten den Nutzern von Fahrzeugen und Maschinen im laufenden Betrieb unter die Arme greifen, umso komplexer wird die dahinterstehende Steuerungssoftware. Kritisch wird es insbesondere bei C-Projekten, also Embedded-Systemen in der Programmiersprache C, welche prozedural und nicht objektorientiert angelegt sind. Sie sind deutlich schwerer zu testen als beispielsweise Projekte in C++, die sich viel besser strukturieren und modularisieren lassen. Tatsächlich sind rund 80 Prozent der Steuergeräte von Autos, Nutzfahrzeugen, Bau- und Landmaschinen in C programmiert.
Ein wichtiges Konzept zur Sicherung der Software-Qualität ist das Unit-Testing. Dabei werden Funktionen und Komponenten des Codes isoliert und jeweils eigenen Tests unterzogen. Also nicht der Gesamtcode, sondern nur einzelne Abschnitte („Units“) werden auf Fehlerfreiheit getestet. Als Messwerte für die Qualität einer Software dienen unter anderem die Parameter der Teststrategie in Verbindung mit der Testabdeckung. Für die Entwickler steigt der Druck, sich solcher Mittel zu bedienen. Das gebietet nicht nur die wachsende Komplexität der Software, sondern nicht zuletzt auch der steigende Druck der Kunden.
Zwar gibt es eine Handvoll verschiedene Frameworks für das Erstellen für Unit-Tests, ebenso einige Mock-Frameworks für die Integration in C-Projekte. Sie haben jedoch einen entscheidenden Nachteil: Jeder Test muss manuell aufgesetzt und auch das Setup dafür manuell gemacht werden. Das bedeutet einen enormen Ressourcenaufwand – etwa 20 bis 25 Prozent der Entwicklerzeit frisst allein das Testen des Codes, trotz solcher Toolunterstützung. Angesichts des Fachkräftemangels stellt das die Entwicklerteams vor kaum lösbare Probleme: Weder Abstriche bei der Codequalität stellen einen gangbaren Weg dar, noch die Verlängerung von Projektlaufzeiten. Für die Zukunft droht sogar noch weiteres Ungemach. Denn ähnlich wie beispielsweise bei den Themen ADS und ADAS, die Teil der Homologation sind, könnte angesichts der bestehenden Herausforderungen auch die Zuverlässigkeit und Fehlerfreiheit der Steuerungssoftware reguliert werden.
Effiziente Gesamtlösung
EDAG hat sich dieses Dilemmas angenommen und eine umfassende Testumgebung entwickelt, die sowohl ressourcenschonend als auch anwenderfreundlich ist und somit die Einführung von Unit-Testing wesentlich vereinfacht. Die wesentlichen Bestandteile sind:
- Ein selbst entwickelter Testumgebungs-Generator,
- ein selbst entwickelter Generator für Mock-Objekte sowie
- begleitente Implementierungs- und Schulungskonzepte.
Die von EDAG erarbeitete Gesamtlösung ist in erster Linie gedacht für die Verwendung auf Applikations-Ebene eines C-Projekts. Aber auch für weitere Projekte mit vielen Abhängigkeiten bietet diese Testumgebung durch das automatische „Mocken“ und Durchbrechen einer solchen Struktur große Vorteile für das Unit-Testing.
Eines der Entwicklungsziele war es, die Bedienung und Integration der Testumgebung schlank und einfach zu halten. So kann sie vom Entwicklerteam schnell erlernt und eingesetzt werden. Aufgrund der begleitenden Unterstützung bei der Teststrategie sowie einführender Schulungen ist Nutzung über das gesamte Entwicklerteam eher die Regel als die Ausnahme.
Automatisierung im Unit-Testing
Die Testumgebung kann in eine CI/CD-Pipeline (Continuous Integration / Continuous Deployment) integriert werden, um automatisierte Tests durchzuführen und Test-Reports zu generieren. Verschiedene Templates sind bereits integriert und müssen nur für das gewünschte System angepasst werden, beispielsweise beim Einsatz von Jenkins-Servern.
Beim automatisierten Test der gesamten Software werden alle bereits bestehenden Code-Abschnitte getestet und die neu hinzugekommenen Funktionen auch. Somit wird verhindert, dass „neuer Code“ Fehler im bestehenden Code hervorbringt. Denn dann würde ein „alter“ Test einen Fehler auswerfen. Im Idealfall werden alle Tests fehlerfrei durchlaufen, dann kann der Code in das Hauptrepository übernommen werden.
Ein wichtiger Punkt ist die Quantifizierbarkeit der Software-Qualität. Als Messwerte für die Qualität einer Software dienen unter anderem die Parameter der Teststrategie in Verbindung mit der Testabdeckung. Auch kann ausgewertet werden, wie oft Software hochgeladen wurde, die Fehler enthielt, wie viele Fehler in der ersten Version enthalten waren und ähnliches.
Dies kann dazu genutzt werden, eine offene Kommunikation mit den Kunden zu führen über Qualitätsanstrengungen und -ergebnisse. Es trägt zu einer besseren Vertrauensbasis bei, wenn man diesem beispielsweise nachweist: „Fünfmal pro Woche werden neue Software-Versionen erstellt, davon ist nur einmal Code dabei, der nicht fehlerfrei durchgeht, das war in einem Tag gefixt, und nun haben wir einen Code, der zu 95 Prozent nach dieser Strategie getestet und in diesem Bereich komplett fehlerfrei ist.“
Positive Kundenreaktionen
Die EDAG-Testumgebung befindet sich bereits im praktischen Einsatz, drei Projektteams nutzen die Eigenentwicklung bereits für ihre Embedded-Systeme, bei einem vierten wird er gerade vorbereitet. In einem großen Unternehmen hat die DevOps-Abteilung dieses Projekt übernommen und führt es im gesamten Konzern in allen relevanten Projekten ein. Die Anwender zeigten sich überrascht von der Möglichkeit, sogar C-Projekte testen zu können, dessen Wurzeln bis in die 90er Jahre zurückreichen.
Schon in der Konzeption der EDAG-Lösung wurde darauf geachtet, dass das Unit-Testing prinzipiell an jedes C-Projekt anpassbar ist, so dass in der Praxis eine möglichst breite Anwendbarkeit gewährleistet ist. Sollte es dennoch zu schwierig werden, können Code-Teile vom Testing ausgeklammert werden.
Positiv wurde auch der hohe Automatisierungsgrad und die detaillierte Dokumentation der Testumgebung aufgenommen. Zudem sind bereits einige Anregungen der Anwender in die Lösung eingeflossen, die kontinuierlich weiterentwickelt wird. So konnte der Nutzwert nochmals gesteigert werden.
Aus diesen praktischen Erfahrungen errechnen sich Einsparungen von 75 bis 90 Prozent des manuellen Testaufwands. So muss für einen erfahrenen Programmierer in einer herkömmlichen Testumgebung das Setup mit 12 min., das Schreiben eines Tests mit 10 min. kalkuliert werden, ohne entsprechende Frameworks sogar noch mehr. In der EDAG-Umgebung sind die gleichen Aufgaben dagegen in 2 bzw. 3 min. erledigt.
Rechnet man den Zeitvorteil auf ein gesamtes Projekt hoch, kommen sehr schnell hunderte von Stunden an Einsparung zusammen. Je nach Größe des Entwicklerteams entspricht das der Arbeit eines Entwicklers in Vollzeit.
Wollen auch Sie Ihre Embedded-Systeme zuverlässiger und sicherer machen? Haben Sie Interesse an einem effizienten Unit-Testing für Ihre C-Projekte? Dann sprechen Sie mit Oliver Wolf aus dem Team Embedded Software bei EDAG, der die automatisierte Testumgebung entwickelt hat. Oder laden Sie sich hier unser Whitepaper „Höhere Qualität für C-Projekte mit weniger Aufwand“ herunter, das weitere technische Details zum Unit-Testing mit der EDAG-Testumgebung verrät.