JQuery Kochbuch (German Edition)
Test fehlschlug), und einen blauen Balken mit dem String
navigator.userAgent
(praktisch für Screenshots der Testergebnisse in verschiedenen Browsern).
Eigentlicher Bestandteil der Seite sind die Testergebnisse. Jeder Eintrag in der nummerierten Liste beginnt mit dem Namen des Tests, gefolgt (in Klammern) von der Anzahl der nicht erfolgreichen und der erfolgreichen Tests sowie der Assertions. Klickt man auf diesen Eintrag, erhält man die Ergebnisse jeder Assertion, meist mit den Details zu erwarteten und tatsächlichen Ergebnissen. Ein Doppelklick führt einfach den Test aus (in Durchzuführende Tests auswählen ist das detaillierter beschrieben).
Unter den Testergebnissen findet sich eine Zusammenfassung mit der Gesamtlaufzeit für das Ausführen der Tests und der Gesamtanzahl aller und der fehlgeschlagenen Assertions.
Ergebnisse sicherstellen
Problem
Die grundlegenden Elemente jedes Unit Tests sind die Assertions. Der Autor der Tests muss die erwarteten Ergebnisse beschreiben und dafür sorgen, dass das Unit Test Framework sie mit den tatsächlichen Werten vergleicht, die eine Implementierung erzeugt.
Lösung
QUnit stellt drei Assertions bereit.
ok( boolean[, message ])
Die einfachste Assertion ist
ok()
, die nur ein Boolesches Argument benötigt. Ist das Argument true, ist die Assertion erfolgreich, ansonsten nicht. Zusätzlich lässt sich auch ein String übergeben, um einen Meldung in den Testergebnissen auszugeben:
test("ok-Test", function() { ok(true,
"ok erfolgreich"); ok(false, "ok nicht erfolgreich");
});
equal( actual, expected[, message ])
Die Assertion
equal
nutzt den einfachen Vergleichsoperator (
==
), um das tatsächliche Argument mit dem erwarteten Argument zu vergleichen. Sind beide gleich, ist die Assertion erfolgreich, ansonsten nicht. Ist sie nicht erfolgreich, werden sowohl der tatsächliche als auch der erwartete Wert im Testergebnis zusammen mit einer Meldung ausgegeben:
test("equal-Test", function() {
equal("", 0, "equal erfolgreich"); equal("three", 3, "equal nicht
erfolgreich"); });
Verglichen mit
ok()
erleichtert
equal()
das Debuggen von Tests, die fehlschlagen, weil es offensichtlich ist, welcher Wert dazu geführt hat, dass der Test nicht erfolgreich war.
deepEqual( actual, expected[, message ])
Die Assertion
deepEqual()
kann wie
equal()
genutzt werden und ist in den meisten Fällen auch die bessere Wahl. Statt den einfachen Vergleichsoperator zu nutzen (
==
), verwendet sie den genaueren Vergleichsoperator (
===
). So ist
undefined
nicht gleich
null
,
0
oder dem leeren String (
""
). Zudem wird auch der Inhalt von Objekten verglichen, so dass
{key: value}
gleich
{key: value}
ist, selbst wenn man zwei Objekte mit verschiedenen Identitäten vergleicht.
deepEqual()
kann auch mit NaN, Datumswerten, regulären Ausdrücken, Arrays und Funktionen umgehen, während
equal()
nur die Objektidentität prüft:
test("deepEqual-Test", function() {
deepEqual(undefined, undefined, "deepEqual erfolgreich");
deepEqual("", 0, "deepEqual nicht erfolgreich"); });
Wollen Sie explizit nicht den Inhalt von zwei Werten vergleichen, kann immer noch
equal()
genutzt werden. Im Allgemeinen ist
deepEqual()
aber die bessere Wahl.
Synchrone Callbacks testen
Problem
Wenn Sie Code mit vielen Callbacks testen, passiert es gelegentlich, dass ein Test, der eigentlich fehlschlagen sollte, doch erfolgreich ist, und sich die fragliche Assertion nie im Testergebnis zeigt. Wenn sich die Assertions in einem Callback befinden, der niemals aufgerufen wird, werden auch die Assertions selbst nicht erreicht, womit der Test still und leise durchgeht.
Lösung
QUnit stellt eine spezielle Assertion bereit, um die Anzahl an Assertions festzulegen, die ein Test enthält. Wird der Test nicht mit der korrekten Anzahl an Assertions abgeschlossen, schlägt diese Assertion fehl, egal was für Ergebnisse die anderen Assertions erzeugt haben (wenn überhaupt).
Die Anwendung ist ganz einfach. Rufen Sie einfach am Anfang des Tests
expect()
mit der Anzahl der erwarteten Assertions als einzigem Argument auf:
test("Ein Test", function() {
expect(1); $("input").myPlugin({ initialized: function() { ok(true,
"Plugin initialisiert"); } }); });
Diskussion
expect()
ist dann am nützlichsten, wenn man wirklich Callbacks testet. Läuft der gesamte Code im Gültigkeitsbereich der Test-Funktion, bietet
expect()
keinen zusätzlichen Wert – jeder Fehler, der Assertions von ihrer Ausführung abhält, würde sowieso dazu
Weitere Kostenlose Bücher