Erfolgsfaktoren im Embedded Testing

 

Embedded Software steckt heutzutage bereits in fast allen Produkten – von einfachen Haushaltsgeräten bis zu sicherheitskritischen Systemen. Gleichzeitig steigen die Anforderungen an Qualität, Sicherheit und Wartbarkeit kontinuierlich an. Softwarefehler sind nicht nur ärgerlich, sondern können im schlimmsten Fall auch Menschen gefährden oder erhebliche wirtschaftliche Schäden hervorrufen.

Aus unserer langjährigen Erfahrung im Testing von Embedded Software, insbesondere in sicherheitskritischen Bereichen wie dem Personentransport und der Medizintechnik, wissen wir, dass Testing nicht «Nice to have», sondern ein entscheidender Faktor auf dem Weg zu einem zuverlässigen und normenkonformen Produkt ist.

Nachfolgend fassen wir zusammen, welche Erfolgsfaktoren sich in unserer täglichen Praxis immer wieder als entscheidend erwiesen haben.

 

Klare und vollständige Anforderungen als Fundament

Im Testing wird grundsätzlich geprüft, dass jede Softwareeinheit genau das tut, was sie soll. Damit dies möglich ist, braucht es klare Anforderungen an die Software. Gerade im Embedded-Umfeld mit normativen Vorgaben wie beispielsweise in der Sicherheitsgrundnorm IEC 61508 oder den produktspezifischen Normen EN 62304 oder EN 50128 definiert, müssen Anforderungen eindeutig formuliert, messbar, widerspruchsfrei und vollständig sein.

Dadurch können diese leicht in Testfälle überführt werden. Wenn sich aus einer Anforderung kein klarer Test ableiten lässt, ist die Anforderung oft nicht präzise genug formuliert.

Damit Interpretationsspielräume und spätere Diskussionen vermieden werden können, kann das Testing-Team bereits beim Review von Anforderungen unterstützen.

 

Frühes Testen verhindert untestbaren Code

Testing ist nicht einfach nur ein Qualitätssicherungsschritt, der nach der Implementation «noch schnell» erledigt werden kann. Vielmehr sollte das Testing von Anfang an in die Entwicklung mit eingeflochten werden.

Wer zu spät mit dem Testen beginnt, sieht sich oft mit fehlender Schnittstellenabstraktion, globalen Zuständen und starken Hardware-Abhängigkeiten konfrontiert.

Erfolgt das Testen bereits begleitend zur Implementierung, wird die Testbarkeit automatisch Teil des Designs und man erkennt früh, ob Module sauber getrennt und Verantwortlichkeiten klar definiert worden sind. Zudem sind früh erkannte Fehler deutlich kostengünstiger zu beheben.

 

Kleine, überschaubare Softwaremodule als Qualitätsfaktor

Grosse Module oder Funktionen mit mehreren hundert Zeilen Code mögen auf den ersten Blick effizient erscheinen. In der Praxis führen solche Strukturen jedoch oft zu einem Geflecht aus Bedingungen, Zuständen und Abhängigkeiten, die nur schwer nachvollziehbar sind. Für das Testing resultiert dies in einem hohen Analyseaufwand, sehr komplexen Testfällen und einer erhöhten Fehleranfälligkeit.

Wird dagegen die Software in kleinere Einheiten mit klar definierten Verantwortlichkeiten aufgeteilt, wird die Logik nachvollziehbar und die Komplexität beherrschbar.

Einzelne Funktionen lassen sich isoliert testen, Abhängigkeiten werden sichtbar und Fehler können schneller lokalisiert werden. Kleine Softwarebausteine erleichtern zudem auch Refactorings und erhöhen längerfristig die Wartbarkeit.

 

Eine solide Testinfrastruktur

Erfolgreiche Tests benötigen eine stabile Infrastruktur. Eine durchdachte Toolchain mit einem geeigneten Test-Framework und umfangreichen Mocking-Mechanismen bilden die Grundlage. Die darauf aufbauenden Tests müssen unabhängig, reproduzierbar und schnell sein. Instabile Tests untergraben schnell das Vertrauen in die Testumgebung und führen dazu, dass Warnungen ignoriert und Tests umgangen werden.

Idealerweise erfolgt die Testausführung automatisiert in einer Pipeline. Dies eröffnet die Möglichkeit, mittels Branch-Richtlinien das Einchecken von neuem Code nur dann zu erlauben, wenn alle bisher implementierten Tests erfolgreich durchlaufen sind. So wird sichergestellt, dass neue Änderungen keine bestehenden Funktionalitäten unbeabsichtigt beeinträchtigen.

Nebst den dynamischen Unit- und Integrationstests sollen auch die statischen Analysetools nicht vergessen werden. Diese helfen dabei, Codierrichtlinien wie MISRA C oder interne Guidelines konsequent einzuhalten. Statische Analyse unterstützt damit nicht nur die Fehlervermeidung, sondern sorgt für langfristige Wartbarkeit und Konsistenz in der Codebasis.

Wo das Zusammenspiel mit realer Peripherie oder zeitkritisches Verhalten geprüft werden muss, bietet Hardware-in-the-Loop (HIL) eine wirkungsvolle Ergänzung. Dabei lassen sich durch die Einbindung von echter oder simulierter Hardware- Systemaspekte verifizieren, die mit reinen Softwaretests nicht vollständig abgedeckt werden können. Mehr dazu finden Sie im separaten Blogbeitrag: https://www.csa.ch/blog/hardware-in-the-loop.

 

Zusammenarbeit mit dem Software- und Hardwareteam

Ein Grundpfeiler eines erfolgreichen Projekts ist eine gute und respektvolle Zusammenarbeit im Projektteam. Die Tester sind angewiesen auf transparente Architekturinformationen und stabile Builds aus dem Entwicklungsteam. Im Gegenzug ist das Testing-Team in der Pflicht, aussagekräftige und reproduzierbare Bug Reports mit klarer Fehlerbeschreibung, definierten Reproduktionsschritten und Logs oder Messdaten zu liefern.

Je präziser die Vorarbeit im Testing, desto schneller kann das Entwicklungsteam reagieren und Fehler beheben. Offene Kommunikation, gegenseitiges technisches Verständnis und eine konstruktive Fehlerkultur sorgen dafür, dass das Testing-Team nicht als lästige Kontrollinstanz, sondern als Qualitätspartner wahrgenommen wird.

 

Unterstützung des Managements

Testing scheitert oft an Prioritäten. Ohne klaren Rückhalt von der Führungsebene bleibt das Testing häufig ein optionaler Posten, der unter Zeitdruck oder bei engen Budgets als erster reduziert wird. Gerade im Embedded-Umfeld ist dies jedoch riskant.

Zeigen sich Fehler spät im Integrationsprozess oder sogar erst im Produktivsystem, kann dies hohe Kosten verursachen. Investitionen in eine gute Testinfrastruktur wirken auf den ersten Blick zwar wie ein Mehraufwand, reduzieren jedoch langfristig Projektrisiken und Gesamtkosten erheblich.

Die Unterstützung des Managements zeigt sich dabei jedoch nicht nur in Budgetfreigaben. Sie äussert sich in realistischen Zeitplanungen, klar definierten Qualitätszielen und einer Unternehmenskultur, in der Testen als fundamentaler Bestandteil der Entwicklung verstanden wird. Erfolgreiches Testing ist somit nicht nur eine technische Disziplin, sondern auch eine Führungsaufgabe.

 

Fazit

Qualität im Embedded Testing ist das Resultat von klaren Anforderungen, einer testbaren Architektur, einer stabilen Testinfrastruktur und einem Management, das Testing bewusst unterstützt.

Wer Testing als grundlegenden Bestandteil der Entwicklung versteht, profitiert mehrfach:

  • Risiken werden früh sichtbar
  • Fehlerkosten sinken
  • die Wartbarkeit der Software steigt nachhaltig

Zudem stärkt ein systematisches Qualitätsverständnis die Zuverlässigkeit der Produkte und die Zufriedenheit der Kunden.

Besonders im sicherheitskritischen Umfeld ist Qualität keine Option, sondern Voraussetzung.

Martin Kuhn

Martin Kuhn

BSc FHNW in Elektro- und Informationstechnik
ISTQB Certified Tester, System Test-Engineer

Über den Autor

Martin Kuhn arbeitet seit 2019 bei CSA Engineering AG. Sein Hauptaufgabengebiet ist das Testen von Embedded Software mit erhöhten Anforderungen an die funktionale Sicherheit wie beispielsweise im Personentransport oder der Medizintechnik.

Kontaktiere uns