© saicle/Shutterstock.com
JavaScript Testing im Aufwind

Entdecke die Möglichkeiten!


Seit seiner Entstehung 1995 hat JavaScript im Umfeld von Webapplikationen stetig an Bedeutung gewonnen. Zum einen ist diese Popularität auf die hohe Verfügbarkeit dieser Sprache in den meisten Webbrowsern zurückzuführen. Zum anderen hat die Entstehung großer Frameworks wie jQuery, Dojo und Ext JS ihren Teil dazu beigetragen. Diese Frameworks sorgen vor allem für die Gleichschaltung von Browserinkompatibilitäten, die Erweiterung des Featuresets von JavaScript und eine beschleunigte und vereinfachte Entwicklung von Applikationen.

JavaScript etabliert sich zunehmend als Kernkomponente im Web. Somit steigt auch der Anteil der Logik in einer Applikation, die zum Client hin ausgelagert wird. Der entscheidende Vorteil dabei: Ein Teil der Berechnungen kann dem Nutzer übertragen werden. Bemerkbar macht sich dies an der wachsenden Zahl an Single-Page-Applikationen, die den klassischen Desktopapplikationen durch die fehlenden Reloads und die Möglichkeit des Realtime-Webs immer ähnlicher werden. Die Verlagerung der Geschäftslogik zum Nutzer hin erhöht die Notwendigkeit von Qualitätssicherung in diesem Bereich – angefangen bei einfachen Themen wie einheitlichen Coding-Standards über statische Codeanalyse bis hin zu umfangreichen, automatisierten Tests in verschiedenen Browsern. Solcherlei Maßnahmen garantieren vor allem die Stabilität und Verlässlichkeit einer Applikation und ermöglichen es, die Software nach Kundenwünschen flexibel und mit geringem Aufwand zu erweitern. Ein erfolgreicher Durchlauf aller Werkzeuge der Qualitätssicherung soll sicherstellen, dass bereits existierende Features nach Veränderungen am Quellcode weiterhin fehlerfrei funktionieren. Dies sorgt für Sicherheit bei den Entwicklern durch ein erhöhtes Vertrauen in die eigene Software.

Unit Testing

Die kleinste Einheit in einer Applikation bildet die Unit. Eine solche abgeschlossene logische Einheit ist unabhängig von den übrigen Komponenten der Applikation. Sie kann über eine Schnittstelle angesprochen werden und liefert definierte Werte zurück. Diese Einheiten stellen die Basis für Unit Tests dar. Ziel des Unit Testings ist nicht, die Funktionalität der gesamten Applikation sicherzustellen. Es dient eher als Unterstützung für das Design stabiler und in sich konsistenter Komponenten. Das bedeutet in der Praxis, dass zur Unit mehrere Testfälle existieren, welche die Funktionsweise dieser Einheit prüfen und gleichzeitig deren Verwendung dokumentieren. Dabei sollte man sich bei der Entwicklung nicht nur auf das „Happy Day“-Szenario beschränken, sondern auch Grenz- und Fehlerfälle absichern. Im Idealfall sind Unit Tests kein einmaliges Hilfsprodukt, sondern ein wichtiger Bestandteil des Entwicklungsprozesses und werden während der Entwicklung stetig weiterentwickelt und ausgebaut.

Im JavaScript-Umfeld existieren seit mehreren Jahren namhafte Frameworks für Unit Tests wie bspw. JsUnit. Es zeichnet sich bis jetzt leider noch kein Trend zu einem einzigen, projektübergreifenden Tool ab, wie es in der PHP-Welt mit PHPUnit bereits seit Jahren existiert. Dieses Problem wird vor allem durch die Tatsache verschärft, dass nahezu jedes JavaScript-Framework sein eigenes Testframework mitbringt. So laufen Unit Tests unter jQuery mit QUnit; Dojo benutzt doh, YUI nutzt YUItest. Darüber hinaus tragen frameworkunabhängige Tools wie JsUnit, J3Unit oder Jasmine ihren Teil zur Vielfalt bei.

Unabhängig vom verwendeten Framework sind die Voraussetzungen für Unit Tests in JavaScript überall dieselben. Der wichtigste hier zu nennende Punkt ist testbarer Code. Quellcode muss bestimmte Kriterien erfüllen, damit er durch Unit Tests abgesichert werden kann. Denn nicht jedes Codefragment ist per se testbar. Die Basis bildet eine saubere Trennung von Logik, Auszeichnung und Layout. Das bedeutet im Regelfall, dass sämtlicher JavaScript-Code in separaten .js-Dateien liegt, das Gerüst der Seite in HTML geschrieben und in .html-Dateien abgelegt ist und das Layout über CSS in den entsprechenden .css-Dateien definiert wird. So ergibt sich die Möglichkeit, seinen JavaScript-Code unabhängig von den übrigen Komponenten zu testen. Es wird hier nach dem Prinzip entwickelt: Nur wenn die kleinste Einheit für sich funktioniert, kann auch die gesamte Applikation fehlerfrei laufen. Um eine gute Testbarkeit des Quellcodes zu gewährleisten, ist darauf zu achten, dass die erstellten Klassen sich auf einen bestimmten Zweck konzentrieren und damit eine Gruppierung logischer Einheiten darstellen. Es sollte vermieden werden, innerhalb einer Klasse verschiedene Themengebiete abzudecken. Es gilt: pro Quellcodedatei nur eine Klasse. Diese bleibt in sich konsistent, was zu einer sauberen Strukturierung der Applikationslogik beiträgt (engl. „Separation of Concerns“).

Als letzter Baustein soll hier noch auf die Dependency Injection eingegangen werden. Dieses Struktur-Pattern beschreibt, dass die Abhängigkeiten einer Methode über Parameter in die Methode einfließen und nicht innerhalb der Methode direkt aufgelöst werden sollten. Hier spricht man von „loser Kopplung“. Die verschiedenen Komponenten sind bis auf Schnittstellen unabhängig voneinander, was die Applikation robuster macht und die einzelnen Methoden flexibler hält, da verschiedene Abhängigkeiten übergeben werden können. Auf diese Weise werden die Tests leichtgewichtiger, da externe Abhängigkeiten einfacher aufzulösen sind.

Im Folgenden wird QUnit verwendet, ein weit verbreitetes und sich aktiv in der Weiterentwicklung befindliches Framework für Unit Tests. QUnit wurde entwickelt, um damit jQuery zu testen. Mit diesem Framework sollen die Prinzipien von Unit Tests in JavaScript verdeutlicht und eine kurze Einführung in die Praxis gegeben werden. QUnit setzt sich zum Ziel, dem Entwickler ein umfangreiches Toolset zur Hand zu geben, das ohne großen Aufwand verwendet werden kann. Die mit QUnit erstellten Tests lassen sich ganz einfach in jedem Browser ausführen. Die dafür notwendige Umgebung kann mit wenigen Schritten aufgesetzt und dann für sämtliche Tests verwendet werden. Die Grundlage für browserbasierte Unit Tests mit QUnit bildet eine einfache HTML-Seite, die als statischer Test Runner verwendet wird. Im ersten Schritt werden qunit.js, die Quelle des Testframeworks, und ein Style Sheet, das zur Darstellung der Testergebnisse dient, eingebunden, im Anschluss dann die zu testenden Klassen, damit der Quellcode für die Tests zur Verfügung steht. Außerdem benötigt QUnit zur Darstellung der Testergebnisse n...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang