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.
| Eingabe | Erwartet | Das richtige System | |||
|---|---|---|---|---|---|
| # | Pfad | Am Ende | Letztes abgelehnt | ||
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.
Lösung
| Pfad | Am Ende | Letztes abgelehnt |
|---|---|---|
| bezahlen, versenden, zustellen, zurückgeben | zurückgegeben | nein |
| stornieren | storniert | nein |
Der lange Pfad geht durch fünf Zustände: neu → bezahlt → versandt → zugestellt → zurückgegeben. „Storniert“ ist ein Endzustand und liegt nicht darauf, also ist es der zweite Pfad: neu → storniert. Diese zwei Pfade nehmen 5 der 6 Übergänge. Bezahlt → storniert bleibt ungeprüft: Das ist der Unterschied zwischen Zustandsüberdeckung und Übergangsüberdeckung.
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?
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.
| Eingabe | Erwartet | Das richtige System | |||
|---|---|---|---|---|---|
| # | Pfad | Am Ende | Letztes abgelehnt | ||
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.
Lösung
| Pfad | Am Ende | Letztes abgelehnt |
|---|---|---|
| bezahlen, versenden, zustellen, zurückgeben | zurückgegeben | nein |
| stornieren | storniert | nein |
| bezahlen, stornieren | storniert | nein |
| bezahlen, versenden, stornieren | versandt | ja |
| bezahlen, versenden, zurückgeben | versandt | ja |
| bezahlen, bezahlen | bezahlt | ja |
| stornieren, bezahlen | storniert | ja |
| stornieren, versenden | storniert | ja |
| versenden | neu | ja |
Drei Pfade nehmen alle gültigen Übergänge: den langen, neu → storniert und neu → bezahlt → storniert. Die ungültigen sind sechs Zeilen, jede mit einem verbotenen Ereignis am Ende: eine versandte Bestellung stornieren und zurückgeben, eine zweite Zahlung, eine stornierte Bestellung bezahlen und versenden, eine unbezahlte versenden. Bei der zweiten Zahlung bleibt die Bestellung auch mit dem Fehler bezahlt, also fängt dort nur die Ablehnung ihn. Die anderen 18 ungültigen Zellen sind ebenfalls Tests. Hier verstecken sie keinen Fehler, aber in einem echten System weißt du das nicht.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Akzeptanzkriterien · Äquivalenzklassen · Grenzwerte · Entscheidungstabellen
- Geht weiter in: Erfahrungsbasiertes Testen
- Aufgaben zum Thema: Testentwurfsverfahren