Das SalesLentz::DevTeam ist das intere Entwicklerteam von Sales-Lentz – eines der größten Reiseunternehmen in Luxemburg.
Jasmine – ein BDD – Framework für Javascript Christoph König, 03 Nov 2011
Jasmine ist ein Framework um Javascript zu testen, bzw. Behavior driven zu entwickeln. Der Framework selbst ist in Javascript geschrieben, die Tests werden ebenso in Jasvascript verfasst. Vom Aufbau her ist die Jasmine-DSL ähnlich der DSL von RSpec.
Ein Beispiel der Jasmine Projektseite von Pivotal Labs
describe("Jasmine", function() {
it("makes testing JavaScript awesome!", function() {
expect(yourCode).toBeLotsBetter();
});
});
In der Dokumentation ist auf der einen Seite die Benutzung beschrieben, und auf der anderen Seite, wie Jasmine in bestehende Projekte integriert werden kann. Neben der Integration als Standalone Lösung existieren weitere Implementierungen für Ruby, Rails, Node.js, Java, etc.
Aufbau eines Spec
Jeder Spec wird durch eine Javascript Funktion formuliert it();. Im Kern geht es darum, eine Annahme mit expect() zu formulieren, und diese dann mit einem entsprechenden Matcher .toBeSomething(); zu überprüfen. Mehrere Specs dürfen auch zu sogenannten Suites describe(); gruppiert werden, welche wiederum ineinander verschachtelt sein können.
Ausführlich ist dies im Abschnitt Suites and specs in der Jasmine Dokumentation beschrieben.
Formulieren von Erwartungen
Um die Erwartung an das zu testende Objekt, Funktion, etc. zu formulieren, stehen schon verschiedene Matcher zur Verfügung. Es können auch eigene Matcher erstellt werden. Wie das funktioniert wird hier erklärt.
Ein Auszug aus den vorhandenen Matchern:
expect(x).toEqual(y); //vergleichen von x und y auf equivalenz
expect(x).toBe(y); //prüfen, ob es sich bei x und y um das selbe Objekt handelt
expect(x).toBeTruthy(); //wird true zurückgeliefert?
expect(x).toBeFalsy(); //wird false zurückgeliefert?
expect(x).toMatch(pattern); //vergleich von x mit einem String oder einem regulären Ausdruck
expect(x).toContain(y); //enthält ein Array oder String x das Elemet y?
expect(x).toBeLessThan(y); //ist x kleiner als y?
expect(x).toBeGreaterThan(y); //ist x grösser als y?
Testbedingungen herstellen
Sind Vor- oder Nachbereitungen zu mehreren Specs zu treffen, können diese in beforeEach() und afterEach() Funktionen deklariert werden. Sie können global und innerhalb einer Suite hinzugefügt werden. Die global definierten werden vor und nach jedem Spec ausgeführt. Analog dazu werden die innerhalb einer Suite definierten nur auf die Specs dieser Suite angewendet.
Weitere Infos dazu im Abschnitt Before and After
Weitere Funktionen
Neben den bisher genannten Möglichkeiten, wird im Abschnitt Spies erläutert, wie man Funktionen beobachten, mocken und faken kann. Dabei wird die zu untersuchende Methode durch einen sogenannten Spy ersetzt. Passende Matcher für diesen Zweck sind ebenfalls schon im Framework vorhanden.
Den Umgang mit asynchronen Aufrufen beschreibt der Abschnitt Asynchronous specs näher.
Ausführen der Tests
Um die Test auszuführen, wird im einfachsten Fall nur ein Webbrowser benötigt. Eine Beispiel Implementierung findet man im Jasmine Repository unter https://github.com/pivotal/jasmine/tree/master/lib/jasmine-core/example. Folgende Alternative wurde von mir für eine Standalone Implementierung verwendet:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Runner</title>
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.1.0/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.1.0/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.1.0/jasmine-html.js"></script>
<!-- include source files here... -->
<script src="../public/javascripts/my_source_file.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="javascripts/my_source_file_spec.js"></script>
</head>
<body>
<script type="text/javascript">
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
jasmine.getEnv().execute();
</script>
</body>
</html>
Wer sich einen ersten Eindruck verschaffen möchte, kann unter http://try-jasmine.heroku.com im Browser eigene Specs erstellen, die Tests ausführen und den passenden Sourcecode hinzufügen.
Beispiel Spec
describe("Stop", function() {
var stop_example_data = {
"name":"Example Stop name",
"arrival_stop_ids":
[
4,
15
],
"id":1
};
beforeEach(function() {
stop = new Stop(stop_example_data);
});
it("#name should return the name", function() {
expect(stop.name()).toEqual("Example Stop name");
});
it("#ID should return the stop's id", function() {
expect(stop.ID()).toEqual(1);
});
it("#arrival_stop_ids should return the arrival stop ids", function() {
expect(stop.arrival_stop_ids()).toEqual([4,15]);
});
});
Links
- http://pivotal.github.com/jasmine
- http://railscasts.com/episodes/261-testing-javascript-with-jasmine
- https://github.com/searls/jasmine-rails
- Writing and running Jasmine specs with Rails 3.1 and Coffeescript
- http://peepcode.com/products/backbone-js (kostenpflichtig)
neueste Artikel
- Jasmine - ein BDD - Framework für Javascript
- Christoph König, 03 Nov 2011
- Cucumber ohne Stützräder
- Hussein Morsy, 19 Oct 2011
- Nachruf Steve Jobs
- Tanja Otto, Hussein Morsy, Christopher Maurer, Christoph König, Dung Nguyen, 06 Oct 2011
- Acceptance Test mit Cucumber
- Christoph König, 03 Oct 2011
- rbenv - Die Alternative zu rvm
- Hussein Morsy, 30 Sep 2011
- Debugging von Rails Applikationen mit PRY
- Christoph König, 31 Aug 2011
- Google Font Directory
- Christopher Maurer, 30 Aug 2011
- Vorschaubild von PDF Dokumenten erzeugen
- Christoph König, 26 Jul 2011
- Git repositories über Dropbox teilen
- Christoph König, 25 Jul 2011
- Remote repositories entfernen
- Christoph König, 30 Jun 2011
Projekte
- acl-reesen.lu
- bon.sales-lentz.lu
- burkinabemoi.com
- catalogues.sales-lentz.lu
- expert.sales-lentz.lu
- flibco.com
- jerrytravel.lu
- lostandfound.sales-lentz.lu
- reiseanfrage.sales-lentz.lu
- reisen.sales-lentz.lu
- reisen.travel.lu
- sales-lentz.lu
- scheivakanz.sales-lentz.lu
- show.lu
- show.travel.lu
- travel.lu
- wellness.sales-lentz.lu
- xmas.sales-lentz.lu
