Skip to main content

SQLUnit

SQLUnit ist ein selbst entwickelter Test Runner für die Ausführung von Tests zu SQL-Abfragen. Aktuell setzt dieser MariaDB voraus, sollte mit wenigen Anpassungen aber auch für andere DBMS verallgemeinert werden können.

usage: sqlunit [OPTIONS] solutionFile [testFile1 [testFile2 [testFile3]
...]]
Runs all tests in the test files by executing the corresponding SQL
queries in the solution files and comparing the result with the expected
result..

OPTIONS:
-o,--out <arg> Output path for the resulting TREX report.
-s,--solution <arg> Comma separated list of paths to the solution
files.

If all tests have finished, exit with status 0. If an unexpected exception
occurs in the test runner, return status 1.

Die Lösungsdatei besteht aus einer Folge von Segmenten, mit einer ID und einem Inhalt. Sollte es mehrere Abfragen in einem Segment geben, wird nur das Ergebnis der letzten Abfrage für die Auswertung der Tests verwendet.

solution.sql
-- QUERY eis:
select distinct(eisName)
from (select name from Eisdiele where ort = 'Wiesbaden')t1
join EisdieleVerkauftEis on t1.name= EisdieleVerkauftEis.dielenName order by eisName;

-- QUERY karteschlecker:
select t1.eisName from
(select * from EisdieleVerkauftEis where dielenName='Lecker Schmecker') t1
natural join
(select eisName, dielenName from EsserBervorzugtEis where dielenName='Lecker Schmecker')t2
group by t1.eisName order by COUNT(preis) desc, eisName;

Die Testdateien bestehen ebenfalls aus Segmenten mit den zugehörigen IDs und geben an, was das Ergebnis der jeweiligen Abfrage sein soll. Das Ergebnis wird mit dem Spaltennamen als Schlüssel und dem Ergebnis als Wert definiert. Mit unsorted: false kann notiert werden, dass die Reihenfolge der Ergebnisse nicht relevant ist. Wird das nicht angegeben, muss die Reihenfolge übereinstimmen.

expected.txt
-- QUERY eis:
{"unsorted": true, "result":
[ {"eisName": "Himbeere"}
, {"eisName": "Schokolade"}
, {"eisName": "Stracciatella"}
, {"eisName": "Vanille" }
]
}

SQLUnit erwartet, dass unter localhost:3306 eine Instanz des MariaDB-Servers mit Version 10.6.x läuft. Es werden die Zugangsdaten root:root verwendet. Weiterhin muss eine Datenbank test existieren, die selbst vorbefüllt werden kann.

Die Ergebnisse werden im TREX bei jeder Änderung des Testzustands in die angegebene Datei geschrieben. Es kommt zu einem Failure, wenn das Ergebnis der Query nicht zur Spezifikation passt. Zu einem Error kommt es, wenn es einen Fehler in der Syntax gibt oder ein Segment in den Lösungdateien fehlt. Bei anderen Fehlern im Runner wird der Exitcode 1 zurückgegeben, wodurch die Ergebnisdatei nicht betrachtet werden sollte.

Build und Tests

Mit ./gradlew build den Runner bauen. Anschließend befindet sich die sqlunit.jar als Fat-Jar unter build/libs. Im Projekt befinden sich ein paar Testfälle um die korrekte Funktionsweise des Runners zu prüfen. Hierfür wird mit MariaDB4j eine Instanz des MariaDB-Servers automatisch gestartet und nach Durchlauf der Tests beendet. Hierfür müssen die Bibliotheken libncurses5 und libnsl installiert sein. Mit ./gradlew test können die Tests ausgeführt werden.