© Lonely/Shutterstock.com
Das JavaScript-Test-Framework auf dem Prüfstand

Test mit Jest


Wer JavaScript nicht automatisiert testet, handelt sich schon wegen des vergleichsweise offenen Sprachstandards über kurz oder lang gravierende Probleme ein. Mit Jest gibt es nun ein neues JavaScript-Test-Framework, das aus den Fehlern der alten zu lernen sucht.

Als sich der Autor dieser Zeilen in den frühen 2010er Jahren mehr als Hobby denn wegen ernsthafter dienstlicher Notwendigkeit mit JavaScript auseinandersetzte, lebte die Sprache im Allgemeinen in Browsern. Die Kämpfe zwischen Mozilla, Opera und dem Internet Explorer hatten dafür gesorgt, dass JavaScript Engines immer schneller wurden. Dadurch konnte man bisher am Server und auf einem nativen Client liegenden Code in Richtung der Cloud übertragen, was die Installation unnötig machte und technisch herausgeforderte Nutzer von den Supporthotlines fernhielt.

In der damaligen Zeit entstanden erste Frameworks, die damals allerdings auf die Arbeit mit webbasierten Inhalten optimiert waren. Produkte wie Node.js und andere Runtimes ließen sich damit, wenn überhaupt, nur unter großem Aufwand testen. Das Jest-Entwicklerteam möchte mit seinem Framework alles anders machen. Das beginnt damit, dass Dienste wie Babel und Node, aber auch die Frameworks Angular, React und Vue unterstützt werden. Neben der Ansage, dass sich Tests mit so gut wie keinem Konfigurationsaufwand einrichten lassen, verspricht man auch, dass die Isolation der einzelnen Testaufgaben in eigenen Threads Prüfungen von sehr großen Codebasen mit sehr hoher Performance bewerkstelligt. Zu guter Letzt betont die unter https://jestjs.io bereitstehende Webseite des Produkts auch noch, dass eine als Snapshot bezeichnete Funktion Vergleiche von Objekten gegen Referenzvorlagen mit geringem Aufwand erledigt. Kurzum gibt es einiges, was Entwickler freuen könnte – werfen wir also einen Blick auf das Produkt.

Eine Frage der Ausführungsumgebung

Die Dokumentation des Frameworks demonstriert die Verwendung des Produkts vorrangig unter Verwendung der Yarn-Arbeitsumgebung. Da wir in den folgenden Schritten unter Ubuntu 18.04 arbeiten, lässt sich die Installation durch den bekannten Dreikampf bestehend aus dem Addieren eines Schlüssels, dem Ausführen eines Skripts und dem Herunterladen eines Pakets bewerkstelligen:

t@t18:~$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-keyadd - t@t18:~$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee/etc/apt/sources.list.d/yarn.list t@t18:~$ sudo apt-get update && sudo apt-get install yarn

Yarn ist nicht nur unter Linux verfügbar. Das Entwicklerteam der Arbeitsumgebung stellt unter [1] Installationsanweisungen für andere Betriebssysteme bereit. Wer unter macOS oder Windows arbeiten möchte, muss nicht auf die Vorteile verzichten. Yarn orientiert sich von der Vorgehensweise her am von Node.js bekannten npm. Analog beginnen wir deshalb auch hier mit der Erzeugung eines neuen Projekts, das in einem leeren Unterordner unterkommen sollte:

tamhan@TAMHAN14:~/yarnspace$ yarn init yarn init v1.13.0 question name (yarnspace): jesttest question version (1.0.0): . . . success Saved package.json Done in 7.82s.

Analog zum großen Vorbild gilt auch hier, dass sie diverse Anfragen im Allgemeinen durch Drücken von Enter quittieren können. Der Autor dieser Zeilen entschied sich immerhin dafür, den Ordnernamen durch einen anderen Projektname zu ersetzen. Im nächsten Schritt folgt ein Aufruf des add-Befehls, der das Test-Framework herunterlädt und installiert:

tamhan@TAMHAN14:~/yarnspace$ yarn add --dev jest yarn add v1.17.3 . . .

An sich ist auch das keine Raketenwissenschaft. Wichtig ist nur, dass der Parameter dev übergeben werden muss. Er weist die Runtime darauf hin, dass die anzulegende Ressource eine devDependency darstellt. Das ist ein Sonderregime von Yarn, in dem das betreffende Paket nur während der Entwicklung bereitgestellt wird. Nach dem erfolgreichen Durchlaufen des Deployment-Prozesses ist die auch in npm-basierten Projekten vorhandene Datei package.json um einen zusätzlichen Verweis auf das Test-Framework reicher. Das lässt sich überprüfen, indem Sie es in einem Editor Ihrer Wahl öffnen. Lassen Sie das File auch gleich geöffnet, weil Sie zusätzlich die Passage aus Listing 1 in der scripts-Rubrik anlegen müssen.

Listing 1

{ . . . "devDependencies": { "jest": "^24.1.0" }, "scripts": { "test": "jest" } }

Jest-basierte Testprozesse lassen sich in der Theorie auch aus der Kommandozeile heraus anstoßen. Die Praxis lehrt allerdings, dass Unit-Test-Prozesse vor allem dann konsequent durchgeführt werden, wenn sie für den Entwickler minimalen bis nicht vorhandenen Aufwand erzeugen. Ein schöner Weg, um Schnelligkeit sicherzustellen, ist die Einbindung von Jest in den Yarn-Workflow. Die Aktivierung des Testprozesses erfolgt dann analog zu allen anderen Kommandos des Paketmanagers; dank der Parallelisierung der Ausführung sollte die Gesamtausführungszeit zudem vergleichsweise gering sein. Damit haben wir die Arbeiten fürs erste abgeschlossen und können mit dem Test beginnen.

Eine erste Trockenübung

Sofern Sie die Datei package.json nach dem Einpflegen des Skriptblocks gespeichert haben, sind wir in der Theorie zur Abarbeitung bereit. Kehren Sie auf die Kommandozeile zurück, und befehlen Sie durch Eingabe von yarn test einen ersten Probelauf. Die wird mit der in Abbildung 1 gezeigten Fehlermeldung scheitern.

hanna_jest_1.tif_fmt1.jpgAbb. 1: Jest startet zwar, verendet aber sofort danach

Wer Jest – wie in der Datei package.json – nicht zusätzlich weiter parametriert, aktiviert die im Framework automatisch enthaltene Dateiergreifungsfunktion. Sie nutzt den in Abbildung 1 in Ocker hervorgehobenen RegEx-String, um alle zum Projekt gehörenden Dateien zu durchsuchen. Leider findet unser Programm zum Zeitpunkt unserer Arbeiten keine derartigen Dateien. Der Unterordner, in dem die von Node.js verwendeten Module unterkommen, ist ausgeschlossen.

Über das, was einen guten Demonstrationsfall für ein Unit-Test-Framework ausmacht, lässt sich seit jeher hervorragend streiten. Ich möchte in den folgenden Schritten eine Datei namens tam.js anlegen, die im Stammverzeichnis des Jest-Prozesses liegen soll. Öffnen Sie sie in einem JavaScript-Editor Ihrer Wahl und fügen Sie anfangs die drei Methoden – wie in Listing 2 zu sehen – ein.

Listing 2

function sayHello() { return "Hello"; } function add(a, b) { return a+b; } function di...

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