Die XML Query Test Suite XQTS

Unter die Lupe genommen

Die Spezifikation der XML-Abfragesprache XQuery steht kurz vor der endgültigen Verabschiedung. Daher ist in naher Zukunft mit einer weiter wachsenden Zahl von XQuery-Implementierungen zu rechnen. Eine Möglichkeit, die inhaltlichen Features dieser Implementierungen zu testen, bietet die XML Query Test Suite, die in diesem Artikel vorgestellt wird.

Über den Stand der Dinge bei der Entwicklung der XML-Abfragesprache XQuery wurde bereits in vergangenen Ausgaben des XML-Magazins berichtet (z.B. [1]). In der Ausgabe 2.06 wurde eine der ersten XQuery-Implementierungen der Anbieter von relationalen Datenbanken vorgestellt: Oracle bietet ab der Datenbankversion 10g Rel. 2 eine XQuery-Unterstützung innerhalb von „normalen“ SQL-Abfragen [2]. Obwohl die Arbeit an der XQuery-1.0-Spezifikation noch nicht abgeschlossen ist (seit November 2005 ist die Spezifikation als Candidate Recommendation veröffentlicht), sind schon zahlreiche Anwendungsfälle für XQuery-Projekte denkbar. Abfragen auf einzelnen realen XML-Dokumenten oder Sammlungen solcher Dokumente, aber auch Abfragen auf virtuellen XML-Dokumenten (beispielsweise auf XML-Sichten von relationalen Datenbanksystemen) können mit den in der XQuery-Spezifikation definierten Techniken durchgeführt werden. Diese XQuery-Spezifikation hat einen beträchtlichen Funktionsumfang, der u.a. auf die Tatsache zurückzuführen ist, dass bereits seit 1999 an der Entwicklung von XQuery gearbeitet wird. Zusammen mit den Möglichkeiten von XPath 2.0 und XML Schema, auf die XQuery aufbaut, ergibt sich eine Vielzahl von Features, die eine XQuery-Implementierung zur Verfügung stellen muss. Wie können Anbieter von XQuery-Implementierungen diesen Funktionsumfang ihrer Tools testen und das Ergebnis solcher Tests als „Marketingmaßnahme“ für ihr Tool veröffentlichen? Seit 2004 wird für solche Zwecke an der XML Query Test Suite gearbeitet. Über die W3C-Seite zu XQTS [3] kann der aktuelle Stand der Test Suite eingesehen werden. Zum Zeitpunkt der Erstellung dieses Artikels lag XQTS in der Version 0.8.4 vor, die bereits ca. 94% der Tests beinhaltet, die für die vollständige Version vorgesehen sind. XQTS ist also ebenso wie das zu testende XQuery noch nicht endgültig verabschiedet. Trotzdem lohnt sich bereits jetzt ein Blick auf Inhalte und vorliegende Ergebnisse dieser Test Suite.

Testfälle

In Version 0.8.4 beinhaltet XQTS ca. 9700 Testfälle. Diese umfassen nahezu das gesamte Spektrum der XQuery-Funktionalität. Gemäß der XQuery-Spezifikation können die XQuery-Features aufgeteilt werden in „Minimal Conformance Features“ sowie in eine Reihe von so genannten „Optional Features“ (Schema Import Features, Schema Validation Features, Static Typing Features, Full Axis Features und Module Features). Auch die XQTS-Testfälle werden in diese Gruppen und weitere Untergruppen aufgeteilt, wobei die „Minimal Conformance Feature“-Testfälle mit einer Gesamtzahl von 9534 den weitaus größten Anteil haben.

Seit XQTS, Version 0.8.4 enthält das XQTS-Paket auch erste Testfälle zu XQueryX. Über XQueryX wird eine alternative Darstellung von XQuery-Abfragen definiert. Während „normale“ XQuery-Abfragen in „SQL-ähnlicher“ FLWOR-Syntax (For-Let-Where-OrderBy-Return) angegeben werden, ist es über XQueryX möglich, dieselbe Abfrage in XML-Syntax darzustellen. In XQueryX formulierte Abfragen sind zwar wesentlich länger und vor allem für Menschen schwieriger zu verstehen, haben aber durch ihre XML-Darstellung Vorteile bei der automatischen Generierung und Verarbeitung über Tools. Angestrebt wird für kommende XQTS-Versionen eine vollständige Abdeckung der bereits vorhandenen XQuery-Testfälle durch korrespondierende XQueryX-Testfälle.

  • ein oder mehrere XML-Dokumente mit den Inputdaten, für die die Testabfragen durchgeführt werden sollen,
  • Dateien mit den zu testenden XQuery-Abfragen,
  • Dateien mit den erwarteten Antworten.

Listing 1

.
Path ExpressionsStepsAxesTests in this group focus on the axes named in XQuery 3.2.1.1 and the / and // step operators of 3.2.1. Abbreviated versions (@ vs. attribute::) are included. NodeTests are typically *, node(), or a name.no children for child::*Path 'child::*' from an element.TreeTruncAxes001-1.txt1 child for child::*Path 'child::*' from an element.Tree1ChildAxes001-2.txt
..

.

Die Testobjekte (Abfragen, Testdokumente, erwartete Ergebnisse) liegen also im XQTS-Zipfile vor. Einer Testdurchführung steht also eigentlich nichts mehr im Wege. Ganz so einfach ist das natürlich nicht, denn aufgrund der Tatsache, dass es derzeit noch kein standardisiertes XQuery-API gibt, hat jeder Hersteller seine eigene Syntax, mit der XQuery-Abfragen aufgerufen werden können. Dies können beispielsweise in SQL eingebettete XQuery-Abfragen innerhalb eines Datenbanksystems sein [2] oder XQuery-Aufrufe aus einem Java-Programm heraus. Jeder Hersteller hat also seine eigene Aufrufsyntax, seinen eigenen Weg, externe Variablen innerhalb von XQuery-Abfragen zu füllen etc. XQTS enthält daher kein fertiges API, mit dem die Tests automatisiert durchgeführt werden können. Jeder Hersteller muss die Testumgebung selber bauen und die vordefinierten Testfälle damit aufrufen. Neben der Auswahl und dem Aufruf der zu testenden Inputdateien, der Erzeugung der passenden Outputformate sowie auf der Basis dieser Outputformate der Feststellung des Testergebnisses besteht eine zentrale Aufgabe darin, die korrekte Systemumgebung für die Tests herzustellen.

Listing 2

(: Name: Axes001 :)
(: Description: Path 'child::*' from an element. :)

(: insert-start :)
declare variable $input-context external;
(: insert-end :)

fn:count($input-context//center/child::*)

Am Beispiel des aus XQTS entnommenen Testfalls in Listing 2 sind mehrere Varianten denkbar, die zu testenden Daten an den XQuery-Ausdruck zu übergeben. Die Metadaten zu diesem Testfall in der oben bereits beschriebenen Datei XQTSCatalog.xml legen fest, dass die Inputdaten für diesen Testfall aus der Datei TreeTrunc.xml, die ebenfalls im XQTS-Zipfile enthalten ist, verwendet werden müssen. Die XQTS-Beschreibung erlaubt explizit die Änderung der vordefinierten Testfälle gemäß bestimmter Regeln, um die Übergabe der Testdaten aus TreeTrunc.xml in den $input-context aus Listing 2 zu implementieren. Dies kann beispielsweise erfolgen durch

  • Übergabe als externe Variable (also mit unverändertem Testfall gemäß Listing 2).
  • den impliziten Context gemäß den Regeln der vorliegenden XQuery-Implementierung. In diesem Fall muss die Deklaration der externen Variablen $input-context im Testfall gelöscht und die Zeile fn:count($input-context//center/child::*) durch die Zeile fn:count(.//center/child::*) ersetzt werden.
  • Einsatz der fn:doc-Funktion aus der XQuery-Spezifikation, mit der die Daten aus einer externen Datei eingelesen werden, d.h. Umformulierung des Testfalls in fn:count(fn:doc(„TreeTrunc.xml“)//center/child::*)

Die XQTS-Dokumentation enthält weitere Regeln zur Einbeziehung von Namespace-Angaben und zur Durchführung von XQueryX-Tests. Ein weitgehend automatisierter Vergleich der pro Testfall erzeugten Outputdaten mit der „Musterlösung“ in den erwarteten Testergebnissen erfolgt auf der Basis von serialisierten Dateien gemäß den Regeln aus der Spezifikation zu „XSLT 2.0 und XQuery 1.0 Serialization“ [4].

Vorliegende Testergebnisse

Zum Zeitpunkt der Erstellung dieses Artikels waren über die XQTS-Webseite die Ergebnisse von drei Herstellern veröffentlicht, die ihre XQuery-Implementierung mit den XQTS-Testfällen getestet haben:

  • Saxon-SA [5]
  • xq2xsl [6]
  • X-Hive/DB [7]

Jedem Hersteller einer XQuery-Implementierung, der die XQTS-Tests für sein Tool durchgeführt hat, steht es frei, die Ergebnisse im durch XQTS festgelegten Format über die XQTS-Webseite zu veröffentlichen. Auch eine anonyme Weitergabe der Testergebnisse wäre möglich. Zu jedem veröffentlichten Testlauf gibt es eine Zusammenfassung mit den Ergebnissen (Anzahl erfolgreicher, Anzahl fehlerhafter und Gesamtanzahl Testfälle), aufgeteilt auf die verschiedenen in XQTSCatalog.xml definierten Testgruppen. Derzeitiger „Testsieger“ ist Saxon-SA in Version 8.6 mit 9675 erfolgreich getesteten Testfällen.

Fazit

Was ist nun von veröffentlichten XQTS-Ergebnissen zu halten? Sagen sie wirklich etwas über die Qualität des getesteten Produktes aus im Sinne von „Ein Produkt, das weniger als x % der XQTS-Testfälle nicht bestanden hat, taugt nichts“? Sicher würde man es sich damit etwas zu einfach machen. Neben der Frage, ob solche weniger erfolgreichen Tests überhaupt veröffentlicht würden, kann es sich bei „fehlerhaften“ Testergebnissen natürlich auch um Fehler in den Testfällen selber halten. Wie bereits zu Beginn dieses Artikels erwähnt, befindet sich XQTS selber noch in einer „Beta-Version“, sodass solche Fehler natürlich nicht auszuschließen sind. Michael Kays Veröffentlichung seiner SAXON-Testergebnisse [8] ist ein Beispiel für solche XQTS-Fehler: Michael Kay berichtet hier, dass er für 9 von 11 Testfälle, bei denen SAXON angeblich das falsche Ergebnis geliefert hat, keinen Fehler in seiner Software verantwortlich gemacht hat, sondern stattdessen einen Bugreport zu XQTS eingereicht hat.
Außerdem spielt bei der Auswahl eines geeigneten XQuery-Produkts natürlich nicht nur die 100-prozentige Erfüllung der inhaltlichen Tests eine Rolle, sondern auch noch andere Kriterien, vor allem die Performance eines Produktes. Was bringt eine 100-prozentige Testerfüllung, d.h. eine fehlerfreie Umsetzung der Spezifikation bis in das kleinste Detail, wenn Standardabfragen inakzeptable Antwortzeiten liefern? Gerade in diesem wichtigen Punkt haben XQuery-Produkte noch einen Rückstand gegenüber ihren „Konkurrenten“ wie z.B. SQL aufzuholen, der zwar zu diesem frühen Zeitpunkt im „Leben“ der neuen XML-Abfragesprache nachvollziehbar ist, aber bei der Praxistauglichkeit von XQTS noch einige Fragen offen lässt.
Zumindest für den Test und die Beurteilung der formalen Korrektheit vorliegender XQuery-Implementierungen stellt die XQTS-Test-Suite aber ein interessantes Hilfsmittel dar. Es bleibt zu hoffen, dass die XQTS-Testfälle den Herstellern von XQuery-Implementierungen bei den Tests ihrer Tools behilflich sein werden und in Zukunft dann auch mehr Testergebnisse veröffentlicht werden.

[1] Rudolf Jansen: XQuery – Das SQL des 21.Jahrhunderts!?, in: XML & Web Services Magazin 2.2005, S. 28-31

[2] Carsten Czarski: Herzlich willkommen – XQuery in Oracle 10g Release 2, in: Entwickler Magazin 2.06, S. 162-164

[3] W3C-Seite zu XQTS: www.w3.org/XML/Query/test-suite/

[4] XSLT 2.0 and XQuery 1.0 Serialization: www.w3.org/TR/xslt-xquery-serialization/

[5] Saxon-SA: www.saxonica.com

[6] xq2xsl: monet.nag.co.uk/xq2xml

[7] X-Hive/DB: www.x-hive.com

[8] Saxon-XQTS-Ergebnisse: www.stylusstudio.com/xquerytalk/200601/001039.html

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.