In Abschnitt 2.4.7, „Verwendung von Parametern in Testdaten“ wurde beschrieben, wie dynamische Werte mit Hilfe von Parametern beim Test berücksichtigt werden können. Spannend wird es allerdings, wenn Tabellen mit 1:n- oder n:m-Relationen überprüft werden sollen. Die Verwendung von Parametern kann in diesem Fall zu aufwändig werden, da für jede dynamische ID ein eigener Parameter eingefügt und im Test ermittelt werden muss. Mit dem Konzept der Autoparameter stellt checkerberry db eine einfachere Möglichkeit für diese Situationen zur Verfügung.
Die Definition von Autoparametern erfolgt in den Testdaten durch
die Zeichen #{
, gefolgt von dem Parameternamen
und einer abschließenden geschweiften Klammer
}
.
Beispiel 2.22. Beispiel Autoparameter: Erwartete Testdaten
<dataset> // Für die Pizza-ID wird der Autoparameter pizzaId verwendet. <PIZZA ID="#{pizzaId}" NAME="Salamipizza"/> // Für die Topping-ID wird der Autoparameter toppingId verwendet. <TOPPING ID="#{toppingId}" NAME="Salami"/> // In der Zuordnungstabelle werden die gleichen Autoparameter // verwendet. <PIZZA_TOPPING PIZZA_ID="#{pizzaId}" TOPPINGS_ID="#{toppingId}"/> </dataset>
Das obige Code-Beispiel enthält erwartete Testdaten, in denen zwei
Autoparameter angegeben sind. Nach der Durchführung eines Tests wird
erwartet, dass eine neue Salamipizza in der Datenbank angelegt wurde.
Der Pizzabelag wird der jeweiligen Pizza über eine n:m-Beziehung
zugewiesen. Zu diesem Zweck werden die beiden Autoparameter
pizzaId
und toppingId
definiert.
Die folgende Abbildung beschreibt wie die Werte der Autoparameter ermittelt werden.
Die Abbildung enthält den relevanten Teil der Datenbank und den
relevanten Teil der erwarteten Testdaten. Die Spalte
NAME
ist als Lookup-Key der Tabelle
PIZZA
definiert. Über den Wert dieser Spalte
ermittelt checkerberry db die Zuordnung zwischen Datenbank und
Testdaten. Da der Wert für den Autoparameter
pizzaId
in checkerberry db noch unbekannt ist,
wird er auf den Wert der Spalte ID
der
zugeordneten Datenbankzeile gesetzt. Der neue Wert des Autoparameters
ist somit „4711“.
Wie in Abbildung 2.12, „Beispiel Autoparameter: Ermittlung der toppingId“ dargestellt
ist, erfolgt die Ermittlung des Autoparameters
toppingId
auf die gleiche Art und Weise wie für
den Autoparameter pizzaId
. Der neue Wert des
Autoparameters ist somit „4712“.
Beim Einlesen der erwarteten Testdaten für die Tabelle
PIZZA_TOPPING
wird festgestellt, dass für die
enthaltenen Autoparameter pizzaId
und
toppingId
bereits Werte ermittelt wurden. Diese
Werte werden in den erwarteten Testdaten eingetragen.
Wie in der obigen Abbildung dargestellt, wird der Wert für den
Autoparameter pizzaId
auf „4711“ und der Wert für
den Autoparameter toppingId
auf „4712“ gesetzt.
Da die zugehörigen Spalten PIZZA_ID
und
TOPPINGS_ID
Teil des Lookup-Keys sind, kann der
zugehörige Datensatz in der Datenbank erst nach dem Setzen der
Autoparameter ermittelt werden. In dem obigen Beispiel wird ein
entsprechender Datensatz in der Datenbank gefunden. Anderenfalls würde
der Test mit einer Fehlermeldung abbrechen.
Beispiel 2.23. Beispiel Autoparameter: Auslesen von Autoparametern im Test
public void testSaveUser() throws Exception { … // Testhandler holen. DbTestHandler testHandler = getEnvironment().getTestHandler(); // Datenbank gegen erwartete Testdaten prüfen. Hier werden implizit die // Autoparameter ermittelt. testHandler.assertEqualsExpected(); // Holen des Autoparameter-Kontexts. AutoParameterContext context = testHandler.getAutoParameterContext(); // Auslesen der pizzaId. Die hat in dem Beispiel den Wert 4711. String id = context.getAutoParameterValue("pizzaId"); … }
Das obige Code-Beispiel zeigt, wie ein Autoparameter in der
Testmethode gelesen werden kann. Die Autoparameter sind nach der
Ausführung der Methode assertEqualsExpected
in
dem AutoParameterContext
enthalten und können über
die Methode getAutoParameterValue
ausgelesen
werden.
Checkerberry db stellt sicher, dass alle Vorkommen eines Autoparameters in einer Testdatendatei den gleichen Wert haben. Wenn der Wert eines Autoparameters noch nicht ermittelt wurde, wird der Wert, wie in Abbildung 2.12, „Beispiel Autoparameter: Ermittlung der toppingId“ dargestellt, ermittelt. Für alle weiteren Vorkommen dieses Autoparameters wird der ermittelte Wert in die Testdaten eingetragen. Wenn es zu einer Abweichung zwischen der Datenbank und den erwarteten Testdaten kommt, wird eine Fehlermeldung erzeugt und der Test schlägt fehl.
Bei Autoparametern handelt es sich um automatisch belegte Parameter, die bei der Überprüfung der Datenbankinhalte ermittelt werden. Um den Wert eines Autoparameters ermitteln zu können, muss die entsprechende Zeile in den erwarteten Testdaten zu dem zugehörigen Datensatz in der Datenbank zugeordnet werden. Diese Zuordnung erfolgt über die Lookup-Keys. Was passiert also, wenn Autoparameter in Lookup-Key-Spalten definiert sind?
In dem vorherigen Beispiel wurden die beiden Autoparameter
pizzaId
und toppingId
in
den Lookup-Key-Spalten der Tabelle
PIZZA_TOPPING
definiert. Dennoch konnten die
Werte der Autoparameter ermittelt werden, da beide Autoparameter auch
in einer anderen Tabelle definiert waren, in denen sie nicht in
Lookup-Key-Spalten vorhanden waren. Dies ist eine notwendige
Voraussetzung: Jeder Autoparameter muss mindestens in einer Spalte
definiert sein, die nicht Teil eines Lookup-Keys ist. Die Reihenfolge
der Zeilen in den erwarteten Testdaten ist dabei nicht relevant. Es
ist somit möglich, dass das erste Vorkommen eines Autoparameters in
einer Lookup-Key-Spalte steht. Die Überprüfung dieser Zeile wird in
diesem Fall verschoben, bis der Wert des Autoparameters ermittelt
werden konnte.
Das folgende Beispiel zeigt den Fall, dass ein Autoparameter nicht ermittelt werden konnte, da er nur in einer Lookup-Key-Spalte definiert ist.
Beispiel 2.24. Beispiel Autoparameter: Definition in Lookup-Key-Spalte
<dataset> // Der Autoparameter userName ist in der Lookup-Key-Spalte NAME // definiert. <USERS NAME="#{userName}" SURNAME="Simpson"/> </dataset>
In den erwarteten Testdaten ist genau ein Eintrag vorhanden. In
der Spalte NAME
der Tabelle
USERS
ist der Autoparameter
userName
eingetragen, wobei es sich bei dieser
Spalte um den Lookup-Key handelt.
Die obige Abbildung zeigt das Problem. Beim Einlesen der erwarteten Testdaten versucht checkerberry db den Wert des Autoparameters zu ermitteln. Da der Lookup-Key in den erwarteten Testdaten jedoch nicht vorhanden ist, kann keine Zuordnung zu den Daten in der Datenbank hergestellt werden. In dieser Situation erzeugt checkerberry db eine Fehlermeldung und der Test schlägt fehl.