© saicle/Shutterstock.com
Kolumne: The Good Parts

Specification-driven Testing


Die Welt der Entwicklungswerkzeuge für JavaScript ist immer in Bewegung. So wundert es nicht, dass nahezu jeden Tag neue Tools zur Qualitätssicherung entstehen und auch wieder verschwinden. Das ist natürlich zum einen dem Umstand geschuldet, dass JavaScript im Vergleich zu seinen Brüdern und Schwestern eine recht junge Sprache ist, zum anderen aber auch der schieren Masse an Entwicklern, die sich tagtäglich mit dieser Sprache auseinandersetzen. Einer von ihnen ist Douglas Crockford, ein JavaScript-Urgestein. Bekannt geworden ist er durch die Entdeckung der guten Seiten von JavaScript („JavaScript: The Good Parts“) sowie durch seinen Syntax-Checker JSLint [1] und die Erfindung des JSON-Formats [2], das in nahezu jeder modernen Webapplikation Einsatz findet. Vor Kurzem veröffentlichte Crockford ein weiteres Werkzeug, um die Qualität von JavaScript-Projekten zu verbessern: JSCheck [3].

Specification-driven Testing

Crockford bezeichnet JSCheck als ein spezifikationsgetriebenes Testwerkzeug. Im Vergleich zu üblichen Unit Tests, in denen ein fester Testrahmen vorgegeben wird, ist die Idee hinter JSCheck die Spezifikation von Parametern, innerhalb derer eine Methode oder ein Objekt zu funktionieren hat. Auf dieser Basis werden anschließend automatisiert konkrete Testfälle erzeugt und ausgeführt.

Ein Beispiel: relative Zeit

Der Einsatzbereich sowie die Vorteile von JSCheck gegenüber herkömmlichen Unit Tests sollen an einem Beispiel verdeutlicht werden: Vor kurzer Zeit schrieb ich eine einfache Funktion, die mir aus zwei Datumsangaben einen relativen Wert berechnet und als Zeichenkette formatiert: 30 seconds ago, 12 minutes ago, 6 days ago etc. In der freien Wildbahn ist diese Funktionalität am häufigsten in sozialen Netzwerken wie Facebook, Twitter und Co. anzutreffen. Listing 1 zeigt eine vereinfachte Variante der Funktion ago, die diese Berechnung ausführt.

Listing 1

function ago(time, fixture) { var distance = time.getTime() / 1000 - fixture.getTime() / 1000; switch(true) { case distance < 0: return 'In the future'; case distance < 60: return "" + Math.floor(distance) + " seconds ago"; case distance < 60 * 60: return "" + Math.floor(distance / 60) + " minutes ago"; case distance < 60 * 60 * 24: return "" + Math.floor(distance / 60 / 60) + " hours ago"; default: return "long ago" } } 

Als Eingabe erhält die Funktion zwei JavaScript-Date-Objekte: den Zeitpunkt, für den die relative Berechnung erfolgen soll (time), und den Zeitpunkt, der als Ausgangspunkt fü...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang