2.4.8. Überprüfen von Datenbankrelationen mit Autoparametern

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.

Abbildung 2.11. Beispiel Autoparameter: Ermittlung der pizzaId

Beispiel Autoparameter: Ermittlung der pizzaId


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“.

Abbildung 2.12. Beispiel Autoparameter: Ermittlung der toppingId

Beispiel Autoparameter: Ermittlung der toppingId


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.

Abbildung 2.13. Beispiel-Autoparameter: Setzen von Werten

Beispiel-Autoparameter: Setzen von Werten


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.

2.4.8.1. Auflösen von Autoparametern in Lookup-Keys

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.

Abbildung 2.14. Beispiel Autoparameter: Fehler bei der Ermittlung

Beispiel Autoparameter: Fehler bei der Ermittlung


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.