JavaScript Testing im Aufwind
Kommentare

Automatisierung
Ein wesentlicher Bestandteil im agilen Softwareentwicklungsprozess ist das regelmäßige und häufige Ausführen der Unit Tests. Hintergrund ist, dass Tests nicht nur lokal auf der Maschine

Automatisierung

Ein wesentlicher Bestandteil im agilen Softwareentwicklungsprozess ist das regelmäßige und häufige Ausführen der Unit Tests. Hintergrund ist, dass Tests nicht nur lokal auf der Maschine des Entwicklers ausgeführt werden, sondern auch automatisiert in einem Environment, das der Zielplattform gleicht.

Um automatisierte Unit Tests im (agilen) Entwicklungsprozess realisieren zu können, ist der Einsatz von unterstützenden Werkzeugen zwingend notwendig. So genannte „Continuous-Integration-Plattformen“ wie beispielsweise Jenkins helfen bei der Umsetzung von vollautomatisierten Tests, denn die CI-Umgebung erkennt Änderungen im Versionsverwaltungssystem und führt daraufhin auf Basis des aktuellen Quellcodes einen komplett neuen Build aus.

Hierbei können Aktionen definiert werden, die während eines Builds ausgeführt werden sollen, etwa die Ausführung aller Unit Tests. Da jeder Entwickler generell dazu angehalten sein sollte, in kurzen Intervallen seine Änderungen am Quellcode in das Versionsverwaltungssystem einzuspielen, erhöht diese Art des Testings die Effizienz der Entwickler im Team, denn Fehler werden frühzeitig identifiziert und können schnell behoben werden.

Jenkins

Im Folgenden wird das Open-Source-Tool Jenkins als CI-Umgebung verwendet. Jenkins ist ein auf Java basierender Server, der viele gängige Versionsverwaltungssysteme (z. B. Git oder Subversion) unterstützt, darüber hinaus ANT- und MAVEN-Tasks ausführen kann und sehr einfach zu installieren und zu konfigurieren ist. Innerhalb von Jenkins kümmern sich definierte Jobs um die automatisierte Ausführung des Builds und der Unit Tests.

Unit Tests für JavaScript

Um einen JavaScript Unit Test automatisiert ausführen zu können ist ein weiteres Werkzeug notwendig. Für diesen Artikel haben wir uns für jsTestDriver entschieden, den Test Runner für alle Tests. Es startet einen HTTP-Server, mit dem die Browser durch den Aufruf einer speziellen Seite, der Capture Page, einmalig verbunden werden.

Von diesem Zeitpunkt an ist der benutzte Browser als auszuführende Plattform registriert. Im Kontext von jsTestDriver nennt sich dieser Vorgang „captured“. Über die Kommandozeile kann der Entwickler nun am Server die Ausführung der Tests anstoßen, die über HTTP an alle Browser geschickt und dort ausgeführt werden. Die Ergebnisse werden wieder zurück an den Server transportiert, wo sie dann sowohl gesammelt präsentiert als auch in ein JUnit-kompatibles XML geschrieben werden können.

Durch die XML-Ausgabe ist die Auswertung in der Continuous-Integration-Umgebung einfach zu realisieren. Obwohl jsTestDriver eine Vielzahl an Assertions bereitstellt, ist die Verwendung von QUnit mithilfe eines Adapters ebenfalls möglich. Dadurch können die bereits gezeigten QUnit-Tests bequem weiter genutzt und automatisiert ausgeführt werden. Der Adapter macht dabei nichts anderes als bestehende QUnit-Tests und Assertions in Testmethoden und Assertions von jsTestDriver zu konvertieren.

Statische Codeanalyse mit JSLint

Neben den Unit Tests hat sich eine weitere Art der Validierung bewährt: die statische Codeanalyse. Im Gegensatz zu den Unit Tests wird bei der statischen Codeanalyse der JavaScript-Code nicht im Browser ausgeführt. Stattdessen werden Fehler lediglich durch eine Analyse des Syntaxbaums identifiziert.

Diese Art der Analyse wird bei anderen Programmiersprachen im Vorgang des Kompilierens ausgeführt. Da JavaScript jedoch nur interpretiert wird, kann mithilfe von JSLint dieser Nachteil beseitigt werden – in der Praxis besonders hilfreich, denn JavaScript-Fehler bleiben im Browser nicht selten unentdeckt oder werden schlichtweg ignoriert.

Darüber hinaus hat JavaScript viele Eigenheiten, die zu schwer auffindbaren Fehlern führen können. Auch bei der Einhaltung von Codekonventionen kann die statische Codeanalyse behilflich sein, da sie z. B. zu kurze Variablennamen oder eine inkonsistente Einrückung von Blöcken aufzeigt.

Zusätzliche Tests ohne Zeitaufwand

Besonders interessant ist die statische Codeanalyse deshalb, weil sie nach der Einrichtung keinen weiteren Zeitaufwand benötigt – im Gegensatz etwa zum Formulieren von Unit Tests. Wie zuvor beschrieben, ist es gerade bei einer interpretierten Sprache wie JavaScript wichtig, statische Codeanalyse zu verwenden, um die Codequalität zu erhöhen.

Das JSLint-Tool von Douglas Crockford benötigt allerdings den JavaScript-Code in einem Textformular eines Browser. Für die Continuous Integration ist daher der Wrapper jslint4java zu verwenden.

Werden Werkzeuge zur statischen Codeanalyse in die Entwicklungsumgebung integriert, erhält der Entwickler ein sofortiges Feedback zur Codequalität und kann viele Fehler bereits feststellen, noch bevor sie bei der Ausführung im Browser auftreten. Das Resultat ist eine deutlich agilere Arbeitsweise bei der Entwicklung von JavaScript.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -