Entwicklung & Design

Unit-Testing für JavaScript: Jasmine als Basis für Jest

Eine Alternative für Jasmine: Jest. (Screenshot: Facebook)

Ganz ehrlich: Wer liebt es, Tests zu schreiben? Die Facebook-Entwickler auch nicht. Deshalb haben sie Jest ins Leben gerufen – schmerzfreies JavaScript Unit-Testing. In diesem Artikel zeigen wir euch Jest und wie ihr es einsetzen könnt.

Jest basiert auf dem relativ bekannten Test-Framework Jasmine, kann aber Einiges mehr. Neben den Basis-Features von Jasmine ist Jest auch in der Lage, eine ganze Reihe von Vorgängen zu automatisieren. So ist Jest in der Lage, selbstständig alle Tests in einem Repository zu finden, oder Mock-Objekte ganz automatisch zu generieren zu, damit du deinen Code schneller Testen kannst – ohne irgendwelche Abhängigkeiten berücksichtigen zu müssen.

jest

Jest erweitert das bekannte Testing-Framwork Jasmine. (Grafik: Facebook)

Jest kann über ein Commando-Tool genutzt werden, denn das Framework durchläuft Tests auf einem Fake-DOM, und das paralell.

In vier Schritten: Jest anwenden

Das folgende Beispiel geht davon aus, dass ihr die sum.js-Klasse testen wollt, die nichts anders macht, als zwei Werte zu addieren.

// sum.js
function sum(value1, value2) {
  return value1 + value2;
}
module.exports = sum;

Um einen Test zu entwicklen, müsst ihr folgende Test-Datei im Verzeichnis tests/ hinterlegen:

// __tests__/sum-test.js
jest.dontMock('../sum');

describe('sum', function() {
 it('adds 1 + 2 to equal 3', function() {
   var sum = require('../sum');
   expect(sum(1, 2)).toBe(3);
 });
});

Mit npm install jest-cli --save-dev könnt ihr das Command-Tool starten. Wenn ihr eure package.json aktualisiert mit …

{
 ...
 "scripts": {
   "test": "jest"
 }
 ...
}

… aktualisiert, könnt ihr den Test via npm test ausführen.

Automatische Mock-Objekte

Ein Grundprinzip des Unit-Testings ist, dass man nur eine „Unit“ testet. Nun ist es aber so, dass diese Einheiten von anderer Software abhängig ist und auf „Modul-Größe“ heranwachsen kann. Und genau hier liegt die Stärke von Jest. Das Test-Framework macht es extrem einfach, einzelne Module von Abhängigkeiten zu isolieren und diese zu testen – völlig automatisiert. Jest generiert somit selbstständig Mock-Objekte um die Funktionstüchtigkeit einzelner Module, ohne die eigentlichen Abhängigkeiten, testen zu können. Hier ein Beispiel:

// CurrentUser.js
var userID = 0;
module.exports = {
  getID: function() { 
    return userID;
  },
  setID: function(id) {
    userID = id;
  }
};
// login.js
var CurrentUser = require('./CurrentUser.js');

Wenn ihr die long.js-Datei mit NodeJS ausführt, wird Jest nicht eingreifen, jedoch: Ein Unit-Test für login.js veranlasst Jest, die require()-Methode zu verändern. Nämlich so, dass sich der Code wie folgt verhält:

var CurrentUser = {
  getID: jest.genMockFunction(),
  setID: jest.genMockFunction()
};

Durch diese Anpassung wird die „echte“ Current.js-Datei durch Mock-Objekte ersetzt. Der zu testende Code ist also isoliert worden, kann aber trotzdem uneingeschränkt getestet werden. Somit müssen keine zusätzlichen „Boilerplates“ entwickelt werden, nur für Abhängigkeiten, die ihr sowieso nicht einem Test unterziehen wolltet.

Jest ist sinnvolle Alternative zu Jasmine

Es ist ein guter Ansat, vieles in einem Framework bereitzustellen, aber Entwicklern trotzdem die Möglichkeit zu bieten, in Einzelfällen anders vorgehen zu können – ganz ohne „dirty hacks“.

Gerade die Mockup-Funktion bei Jest ist eine solche Möglichkeit. Durch die jest.mock()– und jest.dontMock()-APIs könnt ihr bestimmen wie sich Mock-Objekt verhalten. Zusätzlich können in Jest – in speziellen Fällen – völlig neue und eigene Mock-Objekte manuell implementiert werden.

Wenn ihr mehr über Jest erfahren wollt, dann kann ich euch die Dokumentation empfehlen. Das Test-Framework könnt ihr bei GitHub herunterladen. Hier findet ihr ähnliche Artikel zu Frameworks wie Jest.

Was sagt ihr zu Facebooks JavaScript-Unit-Testing?

Zur Startseite
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

3 Kommentare
Enrico Reinsdorf
Enrico Reinsdorf

Hallo zusammen, eigentlich ein sehr interessanter Artikel, wenn da nicht die deutsche Sprache wäre. Nur ein paar Beispiele:

Jest ist sinnvolle Alternative „to“ Jasmine
Ein Unit-Test für login.js veranlasst Jest, die require()-Methode „verändert“.

Vielleicht sollte Mario Janschitz neben dem redaktionellen Wert seines Artikels auch Wert auf ein sauberes Deutsch legen.

Antworten
Augenbluten
Augenbluten

Irgendwie wurde der Artikel leider ziemlich schlampig zusammengestückelt.

Antworten
Mario Janschitz

Hallo! Danke für den Hinweis auf die zwei Fehler.
Ich weiß, als Leser neigt man immer gerne dazu wild zu spekulieren.

Allerdings kann es schon passieren, dass man ein „to“ anstatt einem „zu“ schreibt, wenn man den ganzen Tag englische Dokumentationen liest.

Liebe Grüße,

Antworten
Abbrechen

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!

Hey du! Schön, dass du hier bist. 😊

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team bestehend aus 65 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Danke für deine Unterstützung.

Digitales High Five,
Stephan Dörner (Chefredakteur t3n.de) & das gesamte t3n-Team

Anleitung zur Deaktivierung