SalesLentz::DevTeam

Das SalesLentz::DevTeam ist das intere Entwicklerteam von Sales-Lentz – eines der größten Reiseunternehmen in Luxemburg.

Mehr erfahren »

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

verfasse einen Kommentar