JavaScript Testing im Aufwind
Kommentare

Ein vielversprechendes Tool in diesem Bereich ist Sinon.js. Diese Bibliothek erweitert die Möglichkeiten im Bereich von Unit Tests und kann in Verbindung mit allen bekannten Unit-Test-Frameworks wie beispielsweise

Ein vielversprechendes Tool in diesem Bereich ist Sinon.js. Diese Bibliothek erweitert die Möglichkeiten im Bereich von Unit Tests und kann in Verbindung mit allen bekannten Unit-Test-Frameworks wie beispielsweise QUnit verwendet werden. So stellt Sinon.js Spies (von Spy, Spion) zur Verfügung, die verschiedene Informationen über ihre Aufrufe aufnehmen. Spies können anonym als Ersatz von Funktionen wie zum Beispiel Callbacks eingesetzt oder aber als Wrapper um existierende Funktionen gelegt werden.

Hier stehen vor allem die Argumente, der Rückgabewert, der Scope und eventuell geworfene Exceptions zur Verfügung. Es kann aber auch geprüft werden, ob und wenn ja, wie oft der Spy aufgerufen wurde. Ein weiteres Feature von Sinon.js sind Stubs und Mocks.

Stubs stellen Funktionen mit vordefiniertem Verhalten dar. Sie können wie Spies um bereits existierende Methoden gelegt oder anonym und eigenständig verwendet werden. Mocks sind Methoden, die um andere Methoden gelegt, aber auch eigenständig verwendet werden können. Ihr Verhalten kann vordefiniert werden.

Der Unterschied zu Stubs besteht darin, dass festgelegt werden kann, wie sie verwendet werden sollen. Ein Test schlägt dann fehl, wenn das Mock nicht wie erwartet verwendet wird. So kann beispielsweise festgelegt werden, dass die gemockte Methode mindestens zweimal, höchstens aber viermal aufgerufen werden soll.

Interessant sind bei Sinon.js vor allem die Möglichkeiten im Zusammenhang mit Fakes von Basiskomponenten von JavaScript wie Timern und asynchronen Requests. Sinon.js ermöglicht es, einen Wrapper um setTimeout zu legen und so zeitabhängige Komponenten zu testen, ohne dass der erwartete Zeitrahmen bspw. mit Wartezeiten wirklich erfüllt sein muss.

Mit Sinon.js können asynchrone Anfragen an einen Server abgefangen und innerhalb eines Tests beantwortet werden, ohne dass eine Abhängigkeit zu einem externen Server besteht. Mittels Fake XHR kann ein Wrapper erzeugt werden, der es dem Entwickler erlaubt, sämtliche Parameter einer Anfrage und deren Antwort zu manipulieren.

Dadurch kann die Abhängigkeit vom Server umgangen werden, die Tests werden stabiler und es wird keine zusätzliche Serverinfrastruktur benötigt.

System- und Integrationstests

Unit Tests prüfen wie bereits erwähnt die kleinsten, voneinander unabhängigen Einheiten einer Anwendung. Die Summe dieser Einheiten macht allerdings noch keine funktionsfähige Anwendung aus. Erst durch das Zusammenspiel wird dieses Ziel erreicht.

Das fehlerfreie Zusammenwirken der Softwareeinheiten kann allerdings nicht durch Unit Tests abgesichert werden. Dies würde gegen den Grundsatz der Unabhängigkeit der Komponenten verstoßen, da die einzelnen Komponenten hier durchaus voneinander abhängen. Die Lösung für dieses Problem stellen die so genannten Integrationstests dar.

Sie greifen eine Stufe nach den Unit Tests und prüfen nicht die Funktionsfähigkeit der Einheiten sondern deren Integration in ein größeres Gesamtsystem.

Alternativ: Integrationstests mit Selenium

Für diese Klasse von Tests können zwar die bekannten Werkzeuge für Unit Tests wie beispielsweise QUnit verwendet werden; der Fokus dieser Frameworks liegt allerdings – wie der Name bereits andeutet – auf der Erstellung von Unit Tests, weswegen sich hier der Einsatz anderer Hilfsmittel empfiehlt.

Ein weit verbreitetes Programm zur Erstellung und Durchführung von Integrationstests bei Webanwendungen ist Selenium, eine Sammlung mehrerer Programme. Mit dem Selenium IDE existiert ein Browser-Plug-in zum Aufzeichnen und Ausführen von Integrationstests. Der Selenium WebDriver sorgt für die Automatisierung der Tests.

Im Folgenden soll nur auf das Selenium IDE eingegangen werden; die Automatisierung der Tests wird später gesondert behandelt.

Tests Aufzeichnen im IDE

Grundsätzlich ist das Aufzeichnen von Integrationstests mit dem Selenium IDE sehr einfach. Das Plug-in wird innerhalb des Browsers gestartet und bietet sämtliche Funktionen in einem separaten Fenster. Im ersten Schritt aktiviert man die Aufnahmefunktion, wechselt in das Browserfenster und führt die Aktionen aus, die getestet werden sollen.

Die ausgeführten Aktionen wie Clicks oder Eingaben werden aufgezeichnet. Der so aufgezeichnete Test kann nun im HTML-Format gespeichert, jederzeit wieder geladen und ausgeführt werden. Für die Integrationstests steht eine Vielzahl an Befehlen zur Verfügung, durch die sämtliche Benutzerinteraktionen mit einer Webseite simuliert werden können. Wichtig sind vor allem sämtliche Verify– und WaitFor-Kommandos, mit denen geprüft werden kann, ob bestimmte Texte oder Elemente verfügbar sind oder dass auf deren Verfügbarkeit gewartet werden soll.

Nutzer-Interaktion nachbilden

Für Nutzerinteraktionen stehen Befehle wie click und type zur Verfügung. Es kann aber auch JavaScript mittels eval direkt ausgeführt oder bestimmte Events gefeuert werden. Die meisten Befehle beziehen sich auf Elemente im DOM-Baum. So klickt man auf ein Element oder will herausfinden, ob ein bestimmtes <div>-Element auf der Seite existiert. Zu diesem Zweck gibt es verschiedene Locators.

Elemente können über deren id- oder name-Attribut gefunden werden; aber auch über deren Standort im DOM, via Xpath oder mittels CSS-Selektoren. Beim Zugriff auf Elemente ist darauf zu achten, sich nicht zu sehr auf die Struktur der Seite zu verlassen, da ansonsten durch eine Änderung an der Struktur die Tests fehlschlagen und dadurch ein erheblicher Wartungsaufwand erzeugt wird.

Eine weitere Stärke der Integrationstests mit Selenium ist die Organisation der Tests. Tests und Teile von Tests werden in HTML-Dateien gespeichert. Mehrere Testdateien können zu einer Testsuite gruppiert und im Verbund ausgeführt werden. In Verbindung mit der Option Variablen zu verwenden bieten Testsuites eine Möglichkeit, eine Wiederverwendbarkeit innerhalb von Tests zu erreichen.

Anmelde-Test

Ein Test der Anmeldung an ein Portal könnte beispielsweise folgendermaßen aussehen: In einer ersten Datei werden Benutzername und Passwort in Variablen gespeichert. In einer zweiten Datei wird der eigentliche Anmeldetest durchgeführt, wobei der zuvor gespeicherte Benutzername und das Passwort verwendet werden. In der dritten Datei wird schließlich geprüft, ob der Benutzer korrekt weitergeleitet wird und ob die Anmeldung damit richtig durchgeführt wurde. Der Login-Prozess kann jetzt durch Austauschen der ersten Datei mit verschiedenen Nutzern getestet werden, ohne dass der gesamte Test neu geschrieben werden muss. Ein weiterer Vorteil ist, dass, wenn sich etwas am Login-Prozess ändert, nur die zweite Datei angepasst werden muss, aber alle Testsuites, die diesen Prozess verwenden, davon profitieren.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -