How-To

JavaScript-Code testen: Jasmine, Mocha und Jest im Vergleich

(Abbildung: Shutterstock / TippaPatt)

Wer Code schreibt, muss auch testen. Mittlerweile gibt es eine erfreuliche Konkurrenz bei den entsprechenden Frameworks für JavaScript. Ein Vergleich der drei vielversprechenden Vertreter Jasmine, Mocha und Jest.

Nur bei sehr kurzen Projekten oder Prototypen verzichten ­Entwickler heute noch auf Tests. Ansonsten gehören sie – neben lesbarem Quellcode, einer soliden und modernen Architektur sowie einer verständliche Dokumentation – zum ­unverzichtbaren Qualitätsmerkmal guter JavaScript-Applikationen. Bei der Absicherung von Applikationen mit Unit Tests hat sich in den ­vergangenen Jahren viel getan. Im einfachsten Fall ist der Unit Test eine Funktion einer Applikation, die prüft, ob der zurück­gegebene Wert den Erwartungen entspricht. Eine der simpelsten Lösungen in diesem Bereich ist das Assert-Modul von Node.js – ein Kernmodul der Plattform, mit dem Node.js selbst testet.

Die Architektur des Test-Runners Karma: Mit der Infrastruktur­komponente können Entwickler ihre JavaScript-Tests in einem oder mehreren Browsern durchführen. Sie ist notwendig, weil sich Test-­Frameworks wie Jasmine oder Mocha auf die Tests konzentrieren und nicht auf die Infrastruktur. (Abbildungen: Karma, t3n)

Die Architektur des Test-Runners Karma: Mit der Infrastruktur­komponente können Entwickler ihre JavaScript-Tests in einem oder mehreren Browsern durchführen. Sie ist notwendig, weil sich Test-Frameworks wie Jasmine oder Mocha auf die Tests konzentrieren und nicht auf die Infrastruktur. (Abbildungen: Karma, t3n)

Mit der bloßen Überprüfung von Werten ist es aber oft nicht getan. Moderne Test-Frameworks haben viele ­Komfortfunktionen für einfache Tests. Sie lassen sich anhand verschiedener ­Kriterien vergleichen. Zum Beispiel anhand der grundsätzlichen ­Syntax, den Überprüfungsfunktionen – häufig auch Matcher oder ­Assert-Funktionen genannt – oder der Architektur und dem Laufzeitverhalten. Jasmine war hier lange Zeit der Platzhirsch. ­Lösungen wie Mocha fristeten ein Nischendasein. Mittlerweile gibt es jedoch mehr Wettbewerb und jedes Framework hat seine Stärken und Schwächen.

Die Gemeinsamkeiten

Alle drei Frameworks – Jasmine, Mocha und Jest – sind in ­JavaScript geschrieben und werden als Open-Source-Projekt auf GitHub verwaltet. Sie lassen sich über einen Paketmanager – also NPM oder Yarn – im Projekt installieren. Sowohl Jasmine als auch Mocha und Jest sind unabhängige Frameworks. Das heißt, dass Entwickler damit client-­seitige Applikationen im Browser und serverseitige Applikationen auf Node.js-Basis testen können.

Auch beim Aufbau der Tests gibt es viele Gemeinsamkeiten. In allen drei Frameworks lassen sich die Tests in sogenannten Test-Suites gruppieren. Pro Test-Suite gibt es die Möglichkeit, ­eigene Setup- und Teardown-Routinen zu definieren. Diese ­führen die Frameworks vor oder nach jedem Test aus. Außerdem können Entwickler Funktionen definieren, die zu Beginn und am Ende einer Test-Suite einmalig ablaufen. Die Test-Suites lassen sich in allen drei Frameworks mit der ­describe-Funktion erzeugen und ineinander verschachteln. So kann ein Entwicklerteam die Tests besser steuern und die Struktur sowie die Ausgabe der Ergebnisse aussagekräftiger gestalten. Die Tests werden mithilfe der it-Funktion geschrieben. Diese akzeptiert eine kurze Beschreibung (die vor allem für die Ausgabe der ­Testergebnisse zum ­Einsatz kommt) sowie eine Callback-Funktion (die den ­eigentlichen Test beinhaltet). Listing 1 zeigt ein Beispiel für einen einfachen Testfall.

describe('Calculator', () => {
  let calc;
  beforeEach(() => {
    calc = new Calc();
  });

  it('should add 1 and 1 and return 2', () => {
    const result = calc.add(1, 1);
    expect(result).toBe(2);
  });

  it('should add 2 and 2 and return 4', () => {
    const result = calc.add(2, 2);
    expect(result).toBe(4);
  });
});

Beim grundsätzlichen Aufbau von Tests unterscheiden sich die Frame­works kaum. Alle folgen den Test-Patterns, die sich seit vielen Jahren etabliert haben. Beispiele hierfür sind die Organisation von Tests in Test-Suites, der Einsatz von Setup- und ­Teardown-Routinen oder die Möglichkeit Fixtures und Test-­Doubles zu verwenden. Generell ist es wichtig, dass Entwickler die gleichen Qualitätsmaßstäbe für ihre Test-Codes anwenden wie für ihren produktiven Code – das wichtigste Kriterium ist also gute Lesbarkeit und Verständlichkeit.

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

Schreib den ersten Kommentar!

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