Bild 3 zeigt, dass sich aus dem Testlet ein Zustandsautomat ergibt, welcher die Steuerung des Signals Light_Intensity übernimmt: Die Ausführung der verwendeten Szenarien wird zur Testlaufzeit nacheinander aktiviert und deaktiviert.
Während das ursprüngliche, im oberen Bereich von Bild 3 gezeigte Testlet mehrere Anfangszustände haben konnte, ist das für die Szenarien nicht mehr möglich. Wird eine Anfangsbedingung aktiviert, führt die Aktivierung einer anderen automatisch zu ihrer Deaktivierung.
Mit Hilfe von TPT werden so einfach hierarchisch aufgebaute, konfigurierbare, parallele Zustandsautomaten geschaffen.
Testauswertung auf Basis von Python
Die Beurteilung des Testobjektverhaltens erfolgt durch Auswertungs- oder Assessment-Skripte. Globale Assessment- Skripte werden während der gesamten Laufzeit eines Tests ausgeführt. Lokale Skripte sind einem bestimmten Testlet zugeordnet (Ausführung nur bei Aktivierung des entsprechenden Testlets bzw. eines seiner Szenarien). So kann das Testobjektverhalten abhängig von der Betriebsart, z.B. Normalbetrieb, Übertemperatur oder Notbetrieb, unterschiedlich beurteilt werden.
Assessment-Skripte werden in TPT auf der Basis von Python erstellt. Python wurde von PikeTec um Sprachelemente erweitert (Schlüsselwörter, Typen und Methoden), welche die Testauswertung vereinfachen. Das Listing zeigt einen Ausschnitt aus dem Assessment-Skript des Szenarios Automatic (Testlet „Initialize Light Switch“) zum Test des Automatikmodus.
Ausschnitte aus dem Assessmentskript für den Test des Automatikmodus
1: # Test des Hystereseverhalten unter sinkender Umgebungshelligkeit
2: during TPT.regexp([light_intensity(t) < INTENSITY_LIMIT_LIGHT_ON]):
3: # Scheinwerfer noch aus im aktuellen Zeitintervall
4: if headlight(this.getStartTime()) == false:
5: # Hysterezeit NICHT verstrichen
6: during TPT.regexp([(t) < HYSTERESE_TIME_ON]):
7: if TPT.always(headlight(t) == false):
8: # Verdikt: richtig
9: automatic_ok := true;
10: else:
11: # Verdikt: falsch
12: automatic_ok := false;
13: # Hysterezeit IST verstrichen
14: during TPT.regexp([(t) > HYSTERESE_TIME_ON]):
15: if TPT.always(headlight(t) == true):
16: # Verdikt: richtig
17: automatic_ok := true;
18: else:
19: # Verdikt: falsch
20: automatic_ok := false;
21: # Scheinwerfer eingeschaltet im aktuellen Zeitintervall
22: else:
23: if TPT.always(headlight(t) == true):
24: # Verdikt: richtig
25: automatic_ok := true;
26: else:
27: # Verdikt: falsch
28: automatic_ok := false;
In den Zeilen 9, 12, 17, 20, 25 und 28 wird die Variable automatic_ok je nach Testerfolg auf wahr oder falsch gesetzt. Dazu wird ein weiteres Schlüsselwort (always) verwendet, welches dann den Wert true liefert, wenn die entsprechende Bedingung für jeden Zeitpunkt des Kontextintervalls erfüllt ist. Bei automatic_ok handelt es sich um eine Assessment-Variable. Dies ist ein Array, welches bei jeder neuen Zuweisung ein Element speichert, das den zugewiesenen Wert und Start- und Endzeit des aktuellen Kontextintervalls enthält (Beispiel für einen Arrayelement: {Startzeit: 2,2 s, Endzeit: 2,4 s, Wert: false}). Durch das Auswerten von Assessment-Variablen kann der Zeitpunkt eines falschen Verhaltens bestimmt und ein Fehler schnell eingegrenzt werden.
Andere verfügbare Erweiterungen umfassen Methoden zur Verarbeitung von Zeitintervallen und Assessment- Variablen, zur Signalverarbeitung, umfangreiche Vergleichsmethoden sowie spezielle Kontrollflussroutinen. Eine Auswahl ist in Tabelle 2 aufgelistet.
Nach Erstellen der Testlets, Szenarien und Assessment-Skripte werden die Tests ausgeführt (wahlweise im Debug- oder im Normal-Modus). Nach Abschluss der Testausführung generiert TPT Logfiles oder HTML-Reports. sj