Rand- und Fehlerbedingungen testen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie schreiben Hilfs-Templates, die von anderen benutzt werden sollen, und möchten, dass sie möglichst robust sind.

Lösung

Randbedingungen testen

In allen Programmiersprachen treten Fehler meistens unter Randbedingungen auf. Deswegen sollten Sie Testdaten so wählen, dass auch Extremwerte abgedeckt werden. Solche Randbedingungen umfassen Maximum, Minimum bzw. Innen und Außen. Falls Ihre Templates für diese Spezialwerte korrekt funktionieren, dann werden sie wahrscheinlich auch für alle anderen Werte korrekt funktionieren. Es ist unmöglich, eine erschöpfende Liste aller Randbedingungen anzugeben, weil sie vom jeweiligen Problem abhängig sind. Es folgt daher eine Liste typischer Fälle, die Sie überprüfen sollten.

Falls ein Template auf Knotenmengen agiert (bzw. Sequenzen ab 2.0), sollten Sie die folgenden Fälle testen:

  • eine leere Knotenmenge
  • eine Knotenmenge mit einem Element
  • eine Knotenmenge mit zwei Elementen
  • eine Knotenmenge mit einer ungeraden Zahl von Elementen größer als 1
  • eine Knotenmenge mit einer geraden Zahl von Elementen größer als 2

Falls ein Template auf einem String agiert, sollten Sie folgende Fälle testen:

  • den leeren String
  • einen String der Länge 1
  • weitere Strings mit unterschiedlicher Länge

Falls Ihr Template substring-before oder substring-after bei der Suche verwendet, sollten Sie folgende Fälle testen:

  • Strings, die den Test-String nicht enthalten
  • Strings, die mit dem gesuchten String anfangen
  • Strings, die mit dem gesuchten String aufhören
  • Strings, die nur aus dem gesuchten String bestehen
  • Strings, die mehrere Vorkommen des gesuchten Strings enthalten (sowohl direkt nebeneinander als auch durch anderen Text getrennt)

Falls Ihr Template auf Zahlen agiert, sollten Sie Folgendes testen:

  • die Zahl 0
  • die Zahl 1
  • negative Zahlen
  • Bruchzahlen (0 < x < 1)
  • Zahlen mit ganzen und gebrochenen Anteilen
  • Primzahlen
  • weitere spezielle Randwerte, die von Ihrem Problem abhängig sind

Wenn ein Template zwei Zahlen X und Y vergleicht, sollten Sie Fälle testen, in denen:

  • X < Y, insbesondere X = Y - 1 und X = Y - d, wobei d ein kleiner Bruchteil ist
  • X = Y
  • X > Y, insbesondere X = Y + 1 und X = Y + d, wobei d ein kleiner Bruchteil ist

Wenn Sie ein Schema eines Dokuments kennen oder Zugriff darauf haben, das von einem Stylesheet verarbeitet wird, sollten Sie Eingaben testen, in denen:

  • optionale Elemente fehlen
  • optionale Elemente vorhanden sind
  • unbeschränkte Elemente nur eine Instanz haben
  • unbeschränkte Elemente mehrere Instanzen haben

Fehlerbedingungen testen

Ein robustes, wiederverwendbares Template oder ein solches Stylesheet sollte bei einer fehlerhaften Eingabe ein würdevolles Ende haben. Hierfür werden Sie normalerweise xsl:message mit terminate="yes" einsetzen, um ungültigen Parameterwerten auf die Spur zu kommen.

Wenn ein Template auf Zahlen agiert, dann sollten Sie folgende Fehlerbehandlungen testen:

  • NaN (0 div 0)
  • unendlich (1 div 0)
  • -unendlich (-1 div 0)
  • null, wenn nicht definiert (z.B. beim Logarithmus)
  • negative Zahlen, wenn nicht definiert (z.B. bei der Fakultät)
  • nichtnumerische Eingaben (z.B. »blabla«)

Falls Templates oder Stylesheets Parameter verwenden, sollten Sie testen, was passiert, wenn:

  • Parameter ohne Standardwerte nicht gesetzt sind
  • Parameter Werte außerhalb des erlaubten Bereichs annehmen
  • Parameter Werte vom falschen Typ annehmen

Nicht gesetzte Parameter finden Sie mit dem folgenden Trick:

<xsl:param name="param1">
  <xsl:message terminate="yes">$param1 wurde nicht gesetzt.</xsl:message>
</xsl:param>

Allerdings gibt es keine Garantie dafür, dass dieser Trick funktioniert, weil nirgendwo in der Standardeinrichtung der Wert eines nicht ausgewerteten Parameters festgehalten wird, falls für diesen Parameter ein Wert übergeben wird. Die meisten XSLT-Prozessoren verhalten sich jedoch wohlwollend dieser Technik gegenüber. Wenn Sie vollkommen sichergehen wollen, dann können Sie den Parameter auf einen ungültigen Wert setzen (z.B. 1 div 0) und diesen im Rumpf des Templates testen:

<xsl:param name="param1" select="1 div 0" />
<xsl:if test="$param1 = 1 div 0">
  <xsl:message terminate="yes">$param1 wurde nicht gesetzt, oder er wurde auf unendlich gesetzt, was ungültig ist.</xsl:message>
</xsl:if>

Wenn Sie ein Schema eines Dokuments kennen oder Zugriff darauf haben, das von einem Stylesheet verarbeitet wird, sollten Sie untersuchen, wie ein Stylesheet auf Dokumente reagiert, die: (Dieser Test setzt voraus, dass der XSLT-Prozessor einen nicht-validierenden Parser verwendet oder dass Sie die Referenz auf das Schema aus dem Eingabedokument entfernen.)

  • das Schema vollständig verletzen (z.B. ein ganz anderes XML-Dokument als Eingabe)
  • einige Elemente enthalten, die das Schema verletzen
  • die Einschränkungen minOccurs und maxOccurs verletzen
  • Einschränkungen des Datentyps verletzen.

Diskussion

Wenn Sie XSLT-Code für den Eigenbedarf entwickeln, können Sie frei bestimmen, wie robust Sie Ihren Code haben möchten. Aber wenn andere Ihren Code benutzen, dann ist es ratsam, ein vernünftiges Maß an Fehlerbehandlung einzubauen. Ihre Kunden werden es Ihnen danken, wenn Sie einen Code abliefern, der erlaubte Eingaben auch dann verarbeiten kann, wenn sie ungewöhnlich sind.

Wenn Sie Templates erstellen, die von Rekursion Gebrauch machen, empfiehlt es sich, die Implementierung in zwei Templates aufzuteilen. Das Haupt-Template besorgt die Überprüfung auf Fehler, und wenn es keine gibt, ruft es ein Implementierungs-Template auf, das das Ergebnis rekursiv berechnet. Im Rezept Gebräuchliche mathematische Funktionen implementieren wurde diese Taktik bei Logarithmen benutzt.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de