Automatisierte Tests in Suchprojekten mit der intergator Template Language (ITL)

Testen mit der intergator Template Language

In Suchprojekten steckt, wie in allen anderen IT-Projekten, ein großer Teil der Aufwände in den Tests. Tests, die immer wieder in ähnlicher Weise durchgeführt werden, vor allem innerhalb der Optimierungsphase. Eine Automatisierung dieser Tests brächte unter anderem folgende Vorteile:

  • Schnellere Testergebnisse
  • Einsparungen bei wiederholten Testdurchführungen
  • Reproduzierbare und damit vergleichbare Ergebnisse (was für die Optimierung der Qualität des Suchergebnisses wichtig ist)

Für die Testdurchführung haben sich in der Softwarequalitätssicherung programmierte Unit-Tests etabliert. Diese haben den Nachteil, sehr entwicklungsnah und damit stark abhängig von Entwicklungsumgebungen und –werkzeugen zu sein. Besser wären Tests auf einer abstrakteren Ebene, die ideal vom Kunden selbst betrieben, also auch angepasst und durchgeführt, werden können. Hier bietet sich die intergator Template Language (ITL) an.

Die intergator Template Language (ITL) ist als High-Level API zur Entwicklung von suchbasierten Applikationen auf Basis des intergator Suchindex entworfen. ITL besteht aus einer deklarativen, HTML-ähnlichen, Domain Specific Language und einer umfangreichen Tag-Library. Aufgrund der Einfachheit und dass zur Entwicklung nur ein Texteditor benötigt wird, eignet sich ITL hervorragend zum automatisierten Testen. Im Folgenden wird grob die Entwicklung von automatisierten Tests mit ITL praktisch an einem Internetsuchprojekt beschrieben.

Da ITL generisch und nicht zum Testen entworfen worden ist, schreibt man sich zunächst eigene Strukturen und Funktionen in ITL-Sprache/Tags auf:

  • Kapselung eines Tests mit Testtitel und Testergebnis
  • Ausführung einer beliebigen Suchanfrage: <query query=“suchanfrage“ />
  • Testung, ob ein Suchergebnis die gewünschte Anzahl an Treffern enthält:<assertHitCount/>
  • Testung, ob ein Suchergebnis ein bestimmtes Ergebnis enthält:<assertHit/>
  •  Testung beliebiger anderer Ausdrücke <assertEquals/>

Da ich die geschriebenen Tests auch als Testplan nutze, habe ich noch einen Tag zur Deklaration manueller Testschritte erzeugt <manual/>

Das Schreiben der eigentlichen Tests ist gewissermaßen nur eine einmalige Kodierung der Testschritte in der ITL-Sprache, die man beim Testen ohnehin manuell durchgeführt hätte. Das Ergebnis sieht ungefähr so aus:

<h1> intergator Tests auf Index <itl:output>'{$index}'</itl:output></h1>
<test title="Suche nach Phrasen">
       <query name="q" query="Goldener Reiter" attributes="url" >
             <assertHits more="9" is="{$q}"/>
             <assertHit field="url" is="{$q}" should="sehenswuerdigkeiten/dresdner_neustadt/goldener_reiter.php" />
       </query>
</test>
<test title="Synonyme">
       <query name="q1" query="Dampfschiffahrt" attributes="url" limit="200">
              <query name="q2" query="Dampfschifffahrt" attributes="url" limit="200">
                     <assertEquals is="{count($q1/rows)}" should="{count($q2/rows)}" />
             </query>
       </query>
</test>

Jeder mit HTML vertraute Leser sollte bis auf die assertEquals Anweisung keine Probleme beim Verständnis haben. Letztere verwendet einen XPath-Ausdruck zum Vergleich der Anzahl zweier Suchergebnisse. Natürlich sind solche Ausdrücke im ITL-Handbuch dokumentiert.

Ausgeführt werden die Tests einfach durch einen Aufruf im Browser mit:

http://$host/ig-itl/unittests/Tests.itl

Das Ergebnis sieht so aus:

intergator Tests auf Index 'index-live'
Test: Suche nach Phrasen 
 Q(query=Goldener Reiter, limit=10, index=index-live)"/>
 SUCCESS, found more than 9 (10) hits
 SUCCESS, found 'sehenswuerdigkeiten/dresdner_neustadt/goldener_reiter.php' in field url

Test: Synonyme
 Q(query=Dampfschiffahrt, limit=200, index=index-live)"/>
 Q(query=Dampfschifffahrt, limit=200, index=index-live)"/>
 FAIL, should be '58' but was '68'

Fazit: Mit ITL lassen sich einfach automatisierte Tests in intergator Projekten realisieren, die aufgrund der Einfachheit in Anpassung und Ausführung sogar vom Kunden selbst betrieben werden können.