2.4.9. Dynamische Testdaten durch Funktionen

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.

2.4.9.1. Zusammenhang von Parametern und Funktionen

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.