Kombinatorische State-Transition-Tests für Embedded Systems

Hohe Testabdeckungen schnell erreicht!

Kombinatorische State-Transition-Tests werden in vielen Standards für sicherheitskritische Systeme empfohlen. Sie sind aber für alle Embedded Systeme eine hervorragende Methode, um schnell und strukturiert hohe Testabdeckungen zu erreichen.

Methoden zur Ableitung von Test-Cases

Die bekanntesten Methoden zur Ableitung von Test-Cases sind Äquivalenzklassen und Grenzwertanalyse. Typischerweise werden sie in Unit-Tests in Verbindung mit Code Coverage Messungen (C0, C1, …) verwendet, um die Vollständigkeit der Tests zu prüfen. Asynchrone, nebenläufige Komponenten, wie sie in Embedded Systemen verwendet werden, können allerdings nur sehr schlecht mit synchronen, sequenziellen Unit-Tests getestet werden. Auch für Integrations- oder Systemtests auf Basis von Hardware oder Software in the Loop sind diese Testmethoden kaum geeignet.

Kombinatorische State-Transition-Tests sind weniger weit verbreitet. Sie bieten allerdings hervorragende Möglichkeiten, komplexe, nebenläufige Software mit hohen Abdeckungen zu testen. Man ist damit in der Lage eine Pfadabdeckung für den Zustandsraum der zu testenden Applikation zu definieren (n-switch). Die dafür benötigten Test-Cases können manuell abgeleitet oder generiert werden. Durch geeignete Anwendung der Methode lassen sich sogar Tests zur Datenkombinatorik (n-wise) durchführen.

n-switch und n-wise

Die Methodik des kombinatorischen State-Transition-Tests mit Pfadabdeckung

Kombinatorische State-Transition-Tests als Black Box Tests definieren in einem State-Transition-Diagramm zunächst alle von außen erreichbaren Zustände des System under Test (SUT). Transitionen beschreiben alle Zustandsübergänge zwischen den Systemzuständen. Jeder Pfad vom initialen Zustand (initial) bis zum Endzustand (end) ist ein möglicher Testpfad und damit ein möglicher Test-Case. Um komplette Transition- und State-Abdeckung (0-switch) zu erreichen, müssen die Pfade aller erzeugten Test-Cases zusammen jede Transition mindestens einmal durchlaufen haben.

Höhere Abdeckungen definieren die Kombination aus aufeinander folgenden Transitionen:

  • 0-switch: Jede Transition wurde mindestens 1 Mal durchlaufen. Diese Abdeckung enthält die vollständige Abdeckung der States.
  • 1-switch: Alle Kombinationen von zwei aufeinander folgenden Transitionen.
  • n-switch: Alle Kombinationen von n+1 aufeinander folgenden Transitionen.

Durch die hohe Pfadabdeckung können die Tests viele Probleme aufdecken. Ein Beispiel hierfür sind sporadisch auftretende Race Conditions. Diese sind mit den meisten anderen Methoden nur schwer zu entdecken.

State Transition Pfade

In der Abbildung ist ein vereinfachter State-Transition-Test für einen Geldautomaten modelliert. Die farbigen Pfeile stellen verschiedene Ausführungspfade und damit Test-Cases für den State-Transition-Test dar. Um vollständige Transition und State-Abdeckung (coverage n-switch=0) zu erreichen, sind hier 7 Test-Cases nötig. Für höhere Abdeckungen müssen deutlich mehr Test-Cases generiert werden.

State Transition Testabdeckung

Datenkombinatorik

Kombinatorische State-Transition-Tests sind ebenfalls gut geeignet, um Datenkombinatorik zu testen. Im Beispiel werden alle Kombinationen von zwei Parametern mit jeweils drei Werten gegeneinander getestet. Dies entspricht dem pairwise Test. Auch Kombinationen von mehr Parametern (n-wise) können einfach erzeugt werden. Die dafür nötigen Werte der einzelnen Parameter können gut mit Äquivalenzklassen und Grenzwertanalyse abgeleitet werden.

n-wise und n-switch kombiniert

Kombination und Generierung von Daten und Pfadabdeckung

Man kann die Abdeckung von Daten und Pfaden auch gut miteinander kombinieren. So werden im Beispiel für alle Kombinationen aus 3 Parametern (n-wise) sämtliche Ablaufpfade (n-switch) getestet.

Da die große Anzahl von nötigen Test-Cases manuell kaum mehr entwickelt werden kann, empfiehlt sich für größere Abdeckungen die Verwendung geeigneter Werkzeuge mit Test-Case Generatoren.

Analyse und Dokumentation

Um die entstehenden Test-Cases zu analysieren, zu verstehen und zu dokumentieren, können unterschiedliche Sichten verwendet werden.

  • Ausführungsbäume liefern einen Überblick über alle generierten Testpfade und ihre unterschiedlichen Abläufe.
  • Sequenzdiagramme stellen sehr detailliert einzelne Testabläufe und ihre Interaktion mit dem System under Test (SUT) dar. Ein Soll/Ist Vergleich der Sequenzen ermöglicht die schnelle Analyse und Eingrenzung von Fehlerursachen.
Ausführungsbaum und Sequenzdiagramm für Testcases

Ausführungsbaum und Sequenzdiagramm für Test-Cases

Fazit

State-Transition-Tests sind eine strukturierte Methode zur Entwicklung von Tests für nebenläufige Embedded Systeme.

State-Transition-Tests ermöglichen die Entwicklung von kombinatorischen Test-Cases für hohe Pfad und Datenabdeckungen.

Geringe Abdeckungen können manuell entwickelt werden. Für höhere Abdeckungen empfiehlt sich der Einsatz von Werkzeugen.