Zum Inhalt
wannacode

Zustandsübergänge

Kurz gesagt: Der Zustandsautomat liefert drei Maße für Tests: Jeder Zustand wird besucht (2 Tests für die Bestellung), jeder gültige Übergang wird genommen (3 Tests), und jeder ungültige Übergang wird versucht und abgelehnt. Die ungültigen sind die Mehrheit: Von 30 Paaren aus „Zustand und Ereignis“ sind 6 gültig. Sie sind auch die, die niemand testet.

Problem

Die bezahlte stornierte Bestellung

Ein Kunde storniert eine neue Bestellung. Dann drückt er in einem anderen Browser-Tab, in dem die Zahlungsseite noch offen ist, auf „Bezahlen“. Die Zahlung geht durch. Die Bestellung wird „bezahlt“, das Lager packt sie, der Paketdienst stellt sie zu.

Die Tests der Bestellung bestanden: eine neue Bestellung bezahlen, eine neue Bestellung stornieren, eine bezahlte versenden. Jeder davon war ein erlaubter Übergang. Niemand hatte einen verbotenen versucht.

Die Idee

Der Automat als Tests

In der Lektion „Wenn eine Tabelle klarer ist“ war der Zustandsautomat eine Anforderung. Hier steht er vollständig, mit dem Übergang, der dort fehlte:

Von Ereignis und Bedingung Nach
neu der Kunde bezahlt bezahlt
neu der Kunde storniert storniert
bezahlt der Kunde storniert (vor dem Versand) storniert
bezahlt das Lager übergibt das Paket versandt
versandt der Paketdienst stellt zu zugestellt
zugestellt der Kunde verlangt eine Rückgabe, innerhalb von 14 Tagen nach Erhalt zurückgegeben

Sechs Zustände, sechs gültige Übergänge. „Storniert“ und „zurückgegeben“ sind Endzustände: Aus ihnen führt kein Weg hinaus.

Ein Test ist hier nicht eine Eingabe und eine Ausgabe. Er ist ein Pfad: eine Folge von Ereignissen, und nach jedem wird der Zustand geprüft. Das ist der Zustandsübergangstest.

In den Aufgaben dieser Lektion ist eine Zeile der Tabelle ein Pfad von einer neuen Bestellung aus („bezahlen, versenden“), und geprüft werden der Zustand am Ende und ob das letzte Ereignis abgelehnt wurde. Neben der Tabelle steht ein Diagramm des Automaten: Gehe zu einer Zeile, und sie leuchtet entlang ihres Pfades auf.

Die Idee

Drei Maße

Wie viele Pfade braucht man? Das hängt davon ab, was du abdecken willst.

  • Alle Zustände: Jeder Zustand wird mindestens einmal besucht. Hier genügen 2 Tests. Welche, findest du in der Aufgabe.
  • Alle gültigen Übergänge: Jede Zeile der Tabelle wird mindestens einmal genommen. Die zwei Tests nehmen 5 der 6 Übergänge, und der sechste braucht einen dritten. 3 Tests.
  • Alle Übergänge: die gültigen und jeder ungültige, versucht und abgelehnt. Hier werden die Tests viel mehr.

Jedes Maß schließt das vorige ein. Alle Zustände ist das schwache: Der Fehler vom Anfang wohnte in einem Übergang, den kein Pfad erreichte.

Genauer, für Neugierige

Der ISTQB CTFL v4.0.1 beschreibt das Verfahren in Abschnitt 4.2.4 (Zustandsübergangstest) mit diesen drei Maßen: Überdeckung aller Zustände, Überdeckung gültiger Übergänge (auch 0-Switch-Überdeckung genannt) und Überdeckung aller Übergänge. Der Automat kann als Diagramm oder als Zustandstabelle geschrieben werden. Die Tabelle zeigt auch die ungültigen Übergänge, das Diagramm meist nicht.

Für kritische Systeme (Züge, medizinische Geräte) genügen Tests nicht. Dort wird der Zustandsautomat auch formal geprüft: Ein Werkzeug beweist, dass ein verbotener Zustand auf keinem Pfad erreichbar ist. Das ist Model Checking, eine Art formaler Verifizierung. Die IEEE 1012 bindet den Umfang der Prüfung an die Integritätsstufe: Je teurer der Ausfall, desto mehr Prüfung. Für den Shop ist formale Prüfung zu teuer, für die Bremse eines Zuges nicht.

Probier es aus

Alle Zustände

Schreibe die Pfade, die jeden der sechs Zustände besuchen. Zwei Zeilen genügen.

Die Regel: Eine neue Bestellung wird bezahlt, eine bezahlte versandt, eine versandte zugestellt, eine zugestellte zurückgegeben. Eine neue oder bezahlte Bestellung kann storniert werden, bevor sie versandt ist. Storniert und zurückgegeben sind Endzustände. Jedes andere Ereignis wird abgelehnt, und die Bestellung bleibt, wo sie ist.

Geh auf eine Zeile, und das Diagramm leuchtet ihren Pfad entlang auf.

EingabeErwartetDas richtige System
#PfadAm EndeLetztes abgelehnt
Zeile 1

Ein Pfad ist eine Folge von Ereignissen ab einer neuen Bestellung: „bezahlen, versenden“ (mit Komma oder Leerzeichen). Den Zustand schreibst du als Wort: neu, bezahlt, versandt, zugestellt, storniert, zurückgegeben. Eine leere Ergebniszelle wird nicht geprüft.

Die Idee

Ungültige Übergänge

Die Übergangstabelle listet auf, was erlaubt ist. Für das Testen nützlicher ist die Tabelle Zustand × Ereignis: Jede Zelle sagt, was geschieht, wenn das Ereignis in diesem Zustand eintrifft.

Zustand bezahlen stornieren versenden zustellen zurückgeben
neu bezahlt storniert — — —
bezahlt — storniert versandt — —
versandt — — — zugestellt —
zugestellt — — — — zurückgegeben (innerhalb von 14 Tagen)
storniert — — — — —
zurückgegeben — — — — —

30 Zellen, 6 gültige. Die anderen 24 sind ungültige Übergänge („—“). Jede ist ein Test: versuchen und prüfen, dass sie abgelehnt wird.

Ein Test eines ungültigen Übergangs prüft drei Dinge: Der Versuch wird abgelehnt, der Zustand hat sich nicht geändert, und der Kunde sieht, warum. Und ein ungültiger Versuch pro Test: Wenn der erste fälschlich durchgeht, ist die Bestellung schon in einem anderen Zustand, und der zweite Versuch testet etwas anderes.

Probier es aus

Ist es verboten?

1. Die Bestellung ist versandt. Der Kunde drückt auf „Stornieren“. Was erwartet der Test?
2. Warum werden ungültige Übergänge einzeln pro Test geprüft?
3. Eine zugestellte Bestellung, der Kunde verlangt am Tag 16 eine Rückgabe. Was ist der Test?

Die Idee

Bedingungen an Übergängen

Manche Übergänge haben eine Bedingung (Guard). „Zugestellt → zurückgegeben“ geschieht nur, wenn die Rückgabe innerhalb von 14 Tagen nach Erhalt verlangt wird. Das Ereignis ist dasselbe, aber das Ergebnis hängt von der Bedingung ab.

Hier treffen sich die Verfahren. Die Bedingung ist eine Zahl, also hat sie eine Grenze: Tag 14 wird angenommen, Tag 15 abgelehnt (wenn das Paket am 1. ankam, sind das der 15. und der 16.). Der Automat sagt, wo zu testen ist, Grenzwerte sagen, womit.

Dasselbe gilt für „bezahlt → storniert“: Die Bedingung ist „vor dem Versand“. Der Test sind zwei: das Stornieren einer bezahlten Bestellung, bevor das Lager sie übergibt, und ein Stornierungsversuch direkt danach.

Übung

Alle Übergänge

1. Alle Übergänge und die ungültigen. Das ungültige Ereignis steht zuletzt im Pfad: So prüft die Zeile nur dieses. Beginne mit den riskantesten: bezahlen, versenden, stornieren oder zurückgeben, wenn man es nicht darf. Die Spalte „Letztes abgelehnt“ ist wichtig: Bei manchen Fehlern ist der Zustand derselbe, und der einzige Unterschied ist die Ablehnung.

Schreibe Pfade für jeden der sechs gültigen Übergänge und je eine Zeile für ungültige Übergänge, bis du jeden Fehler fängst.

Die Regel: Eine neue Bestellung wird bezahlt, eine bezahlte versandt, eine versandte zugestellt, eine zugestellte zurückgegeben. Eine neue oder bezahlte Bestellung kann storniert werden, bevor sie versandt ist. Storniert und zurückgegeben sind Endzustände. Jedes andere Ereignis wird abgelehnt, und die Bestellung bleibt, wo sie ist.

Geh auf eine Zeile, und das Diagramm leuchtet ihren Pfad entlang auf.

EingabeErwartetDas richtige System
#PfadAm EndeLetztes abgelehnt
Zeile 1

Ein Pfad ist eine Folge von Ereignissen ab einer neuen Bestellung: „bezahlen, versenden“ (mit Komma oder Leerzeichen). Den Zustand schreibst du als Wort: neu, bezahlt, versandt, zugestellt, storniert, zurückgegeben. Eine leere Ergebniszelle wird nicht geprüft.

Test

Teste dich

1. Die Tests besuchen alle Zustände. Nehmen sie auch alle Übergänge?
2. Welches Maß ist das stärkste?
3. Die Tabelle „Zustand × Ereignis“ der Bestellung hat 6 Zustände und 5 Ereignisse. Wie viele Zellen sind ungültige Übergänge?
4. Was ist eine Bedingung (Guard) an einem Übergang?
5. Warum sind ungültige Übergänge die am häufigsten vergessenen Tests?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·