Innerhalb von checkerberry db ist es möglich, dynamische Informationen über Parameter und Autoparameter in den erwarteten Testdaten einzufügen. In der Praxis stößt man bisweilen jedoch auf Situationen, die auch ein dynamisches Anpassen der initialen Testdaten erfordern. Beispielsweise mag es in einem komplexen System nicht immer ohne größeren Aufwand möglich sein, die aktuelle Uhrzeit von außen zu beeinflussen. Stellt ein solches System dann zeitabhängige Abfragen an seine Datenbank, wie z.B. „Welche User haben sich innerhalb der letzten Woche eingeloggt“, so erfordert das Testen dieser Abfragen die Verwendung von dynamisch zu errechnenden Zeitangaben. Aus diesem Grund bietet checkerberry db neben den Parametern noch einen generelleren Ansatz zur Dynamisierung von Testdaten: in Testdaten eingebettete Funktionen.
Beispiel 2.27. Dynamische initiale Testdaten mit Hilfe von Funktionen
<dataset> // Homer hat sich vor 2 Tagen das letzte Mal eingeloggt. <USERS ID="1" NAME="Homer" LAST_LOGIN="->now(-2 days,+1 hour)"/> </dataset>
Der Ausdruck ->now(-2 days,+1 hour)
wird
hierbei als Aufruf der Funktion now
mit den
Argumenten -2 days
und +1
hour
interpretiert und bei Einspielen der initialen
Testdaten abhängig vom aktuellen Zeitpunkt beispielsweise zu dem
Ergebnis 2011-02-07 16:50:53.047
ausgewertet,
wenn der aktuelle Zeitpunkt 2011-02-09
15:50:53.047
ist.
Parameter werden in dem ParameterContext
abgelegt und behalten ihre Gültigkeit für die Dauer der Ausführung
einer Testmethode. Dieser Mechanismus dient der Unabhängigkeit der
Testmethoden, indem er verhindert, dass Parameter zum Übergeben von
Werten zwischen den Methoden verwendet werden.
Im Gegensatz dazu sind Funktionen in der Konfiguration definiert
und können daher in allen Tests und deren Methoden verwendet werden.
Sie haben jedoch Zugriff auf die jeweils zur aktuellen Testmethode
gehörenden Kontexte (Parameter, Autoparameter, Validatoren) und können
daher sowohl Parameter manipulieren als auch ihr Verhalten abhängig
von Parameterwerten ändern. Als Beispiel sei hier die vordefinierte
Funktion param
genannt, die den Wert eines
Parameters zurückgibt. Im Grunde genommen ist die
Parameter-Schreibweise ${name}
lediglich eine
Kurzform für ->param(name)
.
Funktionen und Parameter können sowohl in den initialen als auch in den erwarteten Testdaten verwendet werden. Sie lassen sich beliebig schachteln und mit normalen Feldinhalten mischen:
Beispiel 2.28. Schachteln von Funktionsaufrufen und Parametern
<dataset> // Ein Mitglied der Familie Simpson und seine Lieblingspizza // Für name=Homer wird der Name „Homer Simpson“ in dem Parameter // „Homer.fullname“ gespeichert. In der darauf folgenden Zeile wird // der Parameter „Homer.fullname“ wieder ausgelesen. <USERS ID="1" NAME="->save(${name} Simpson,${name}.fullname)" /> <PIZZA ID="1" NAME="${->param(name).fullname}’s favourite Pizza" /> </dataset>
Auf die Funktion „save
“ wird weiter unten
noch detailliert eingegangen. Hier sei nur erläutert, dass die
Ergebnisse von Funktionsaufrufen anstelle von diesen in den sie
umgebenden Text eingefügt werden und sich auf diese Art auch
Funktionsargumente oder Parameternamen dynamisch generieren
lassen.
Die einzige Einschränkung bei der Schachtelung bezieht sich auf
den Funktionsnamen: Er darf weder Funktionsaufrufe noch Parameter
enthalten. ->${function}()
würde daher
versuchen eine Funktion namens „${function}
“
aufzurufen anstatt den Parameter aufzulösen und das Ergebnis als den
Namen einer Funktion zu interpretieren.