Zur Übersicht

Tests, die einen zum Narren halten – Ein Entwickler erzählt vom Testen mit Jest

Aktualisiert am 17. Aug. 2020
Massive-art-Leistungen-Technologie

Im Zuge einer User Story wurde ich mit der Aufgabe betraut, mich mit dem mysteriösen Jest Framework auseinanderzusetzen. Es galt, eine umfangreiche Dokumentation über die Geheimnisse und Mythen dieses Testing-Frameworks zu verfassen. Anfangs war ich skeptisch, doch lest selbst!

Einblick in das Repertoire

Bei Jest handelt es sich um ein OpenSource Javascript Testing-Framework aus dem Hause Facebook. Facebook arbeitet eng mit der Community zusammen und ist darum bemüht, dass Jest auch weiterhin auf dem Stand der Dinge bleibt. Das Framework baut auf Jasmine auf und bietet eine umfangreiche und mit Zucker angereicherte Abstraktion, was einen sehr schnellen und unkomplizierten Einstieg ermöglicht. Zum heutigen Zeitpunkt hat Facebook bereits viele Funktionen, die auf Jasmine aufbauen ersetzt und neu implementiert.

Der Fokus des Frameworks liegt definitiv auf dem Testen von Applikationen, die auf das React bzw. React Native Framework aufbauen, welches ebenso von Facebook betreut wird. Jest ermöglicht es einem gezielt, einzelne Komponenten und Module zu testen und bietet dem Anwender dazu eine handvoll hilfreicher Tools.

Mocking

Eines davon wäre das Mocking von komplexen Funktionen. Dabei werden Funktionen, die für das Testen eines bestimmten Ablaufs notwendig sind durch sogenannte Mocks ersetzt. Mocks sorgen für einen erwarteten Output und bieten eine gewisse Transparenz über deren Aufrufe. Wenn zum Beispiel das Anlegen eines neuen Benutzers getestet werden möchte, muss im Normalfall ein API Aufruf abgeschickt werden. Dieser API Aufruf wird im Zuge des Tests durch eine Mock-Funktion ersetzt, welche für einen erwarteten Output sorgt. Der Output könnte beispielsweise ein OK vom Server oder die ID des neuen Benutzers sein. Das sorgt für ein kontrolliertes Szenario und ein konstantes Testen.

Snapshots

Ein weiteres Tool ist das Testen via Snapshots. Sie agieren als gespeicherte Kopie einer gerenderten Komponente. Beim Testen wird eine neue Kopie gerendet und mit der hinterlegten verglichen. Sollten sie unterschiedlich sein, so gilt der Test als fehlgeschlagen. Somit können ungewollte Änderungen vermieden und das korrekte Rendern von Komponenten automatisiert getestet werden. Wird eine Komponente gewollt verändert, so muss anschließend die hinterlegte Kopie upgedated werden. Sie ist sozusagen Teil des Codes und sollte dementsprechend auch beim Reviewen von Arbeiten beachtet werden.

Diese Tools ermöglichen es einem ausführlich, die Funktionalität einzelner Komponenten und deren vom aktuellen State der Applikation abhängigen Verhalten zu testen.

Was noch?

Weiters unterstützt Jest die Entwicklung von Tests indem es keine komplizierte Konfiguration benötigt, sondern auf Namenskonventionen und Konfigurationspakete setzt. So wird beim Ausführen eines Tests das Projekt nach `__test__` Ordnern und `*.test.js` Dateien durchsucht und die enthaltenen Tests ausgeführt. Jest kann so unabhängig von der Projektstruktur in jegliches Projekt integriert werden.

Fazit

Wer jetzt noch nicht von Jest überzeugt ist, der kann sich noch die Vielzahl an weiteren unterstützenden Features anschauen, die hier nicht gelistet wurden. Jest war für mich am Anfang ein weiteres Test Framework, das meint die täglichen Probleme des Javascript Testings zu lösen. Es mag zwar nicht perfekt sein, doch Jest kommt dem ganzen sehr, sehr nahe und ist meiner Meinung nach ein Test-Framework für alle Fälle. Nicht nur wegen des enormen Umfangs an Features sondern auch wegen den sehr performanten und schnellen Resultaten, welche leider sehr ungewöhnlich für Javascript Tests sind. Jest schafft es mit einem sehr geringen Aufwand an Konfiguration eine große Menge an Tests parallel zu bearbeiten und ist daher auch sehr gut für große Projekte geeignet. Obwohl Jest für React Applikationen konzipiert ist, kann es auch auf andere Web Frameworks, wie beispielsweise Vue, Angular oder Express angewendet werden.

Natürlich ist Jest kein Allheilmittel. Es wurden einige Kompromisse gemacht, die die Konfiguration einzelner Tests einschränkt, was für einige Entwickler als No-Go gilt. Weiters stößt Jest an seine Grenzen, wenn es um komplexe UI-Tests geht. Tests schreiben ist keine leichte Übung und macht auch nicht allzugroßen Spaß, doch Jest schaffte es tatsächlich eine für mich angenehme Test-Umgebung zu schaffen, in der ich auch in Zukunft gerne weiterarbeiten werde.