Nightwatch.js: Ein Test-Framework für alle Anforderungen

Um die Qualität von Software zu gewährleisten, ist ausgiebiges Testen unabdingbar. Idealerweise sollte dazu das Testen bereits von Anfang an in den Entwicklungsprozess integriert werden, um bereits früh Fehler zu identifizieren. Zum Testen von Software gibt es eine Reihe an Möglichkeiten, angefangen bei Unit-Tests zum Testen kleinster Einheiten, über Component und Integration Tests bis hin zum Testen einer Anwendung als Einheit durch End-To-End-Tests (E2E). In der Testlandschaft hat sich dabei ein Framework positioniert, das durch seine Vielseitigkeit überzeugt: Nightwatch.js.

Was ist Nightwatch.js?

Nightwatch.js ist ein Open-Source Projekt, das seit 2014 existiert. Es handelt sich dabei um ein Framework für automatisiertes E2E-Testing, das auf Node.js basiert. Allerdings bietet dieses ebenfalls die Möglichkeit, Unit-, Component- oder Integrationstests zu schreiben.

Mit Nightwatch lassen sich Webanwendungen, Webseiten sowie mobile Applikationen unter Android und iOS testen. Für letztere bedient sich Nightwatch dem Framework Appium, welches ebenfalls der Automatisierung von Tests dient.

Tests lassen sich in allen gängigen Browsern (Chrome, Firefox, Safari und Edge) durchführen. Dazu folgt Nightwatch der WebDriver-Spezifikation des World Wide Web Consortium (W3C), welche einen Standard für das Automatisieren von Browsern darstellt und auf HTTP basiert. Mittels WebDrivern erfolgt die Kommunikation zur Interaktion mit dem Browser, um Tests durchzuführen.

Was bietet Nightwatch alles?

Test-Runner: Mit dem Test-Runner für die Kommandozeile bietet Nightwatch eine einfache Möglichkeit, um Tests auszuführen. Gleichzeitig ermöglicht dies die reibungslose Integration in automatisierte Build- und Deploy-Prozesse.

Parallelisierung: Bei einer Vielzahl an Tests kann es dauern, bis diese sequentiell ausgeführt werden. Dies ist besonders mühsam, wenn eine Anwendung oder Webseite in verschiedenen Browsern getestet wird. Um dieses Problem zu umgehen, bietet Nightwatch Parallelisierung mittels der Integration von Selenium Grid an.

Cloud-Umgebungen: Ein weiterer Punkt ist die Ausführungsumgebung. Nightwatch ermöglicht die Verwendung von Cloud-basierten Testplattformen wie BrowserStack oder SauceLabs. Dadurch kann die zu testende Anwendung oder Webseite in Browserinstanzen in der Cloud getestet werden, sodass lokal keine Testumgebungen erforderlich sind.

Weitere Testarten: Wie bereits erwähnt ermöglicht Nightwatch von E2E bis Unit alle Arten von Testmöglichkeiten. Darüber hinaus bietet das Framework ebenfalls Funktionalität für die folgenden spezifischen Testmöglichkeiten:

1. Accessibility-Tests
Nightwatch integriert mit der Accessibility Test Engine Axe vordefinierte Tests, mit denen sich Webseiten und HTML-basierte Benutzeroberflächen auf Barrierefreiheit testen lassen. Die Tests prüfen die in den Web Content Accessibility Guidelines (WCAG) definierten Richtlinien in verschiedenen Stufen sowie gängige Best-Practices zum Sicherstellen von Barrierefreiheit im Web.

2. Visuelle Tests
Visuelle Tests, häufig unter Visual Regression Testing bekannt, dienen dem Testen des Verhaltens einer Anwendung mittels Screenshots. Dazu wird vor und nach Ausführen einer Aktion ein Screenshot gemacht, sodass die Auswirkungen der Aktion auf Korrektheit überprüft werden können. Nightwatch integriert diese Art des Testens, indem es sich JIMP bedient, einer JavaScript-Bibliothek zur Bildverarbeitung.

3. API-Tests
Die Kommunikation zwischen Client und Server spielt eine wichtige Rolle bei interaktiven Anwendungen und Webseiten. Um sicherzustellen, dass die API sich wie gewollt verhält, sind API-Tests unverzichtlich. Nightwatch bietet dazu das Plugin apitesting. Damit lassen sich Requests senden und festlegen, welche Daten in der Server-Response erwartet werden (beispielsweise Statuscode, Content-Type oder der Content im Body). Zusätzlich bietet Nightwatch die Möglichkeit, Mock-Server zu programmieren.

Wie ist Nightwatch zu verwenden?

Bei der Verwendung von Nightwatch.js spielt die präzise Auswahl von Elementen eine entscheidende Rolle, um diese Testen zu können. Selektoren ermöglichen es, spezifische HTML-Elemente auf Webseites und in Anwendungen zu identifizieren und mit diesen zu interagieren. Nightwatch.js unterstützt verschiedene Arten von Selektoren, darunter:

  • HTML/CSS-Selektoren ermöglichen das Selektieren über Klassen, IDs, HTML-Tags sowie Verschachtelungen beziehungsweise Vater-Kind-Beziehungen
  • XPath-Selektoren ermöglichen das Selektieren von Nodes aus XML-Dokumenten
  • textbasierte Selektoren ermöglichen die Suche nach Texten für verschiedene UI-Elemente wie beispielsweise Labels, Bilder oder Formularfelder

Selektierte Elemente können auf verschiedenste Arten manipuliert werden, wie beispielsweise das Klicken von Buttons oder das Eintragen von Texten in Formularfeldern. Damit sind mit Nightwatch unzählige Tests denkbar.
Falls die von Nightwatch vorgegebenen Kommandos nicht ausreichen sollten, bietet das Framework zusätzlich die Möglichkeit, eigene Kommandos zu definieren.

Um sicherzustellen, dass die Funktionalitäten der Anwendung wie beabsichtigt funktionieren, kann mittels Assertions festgelegt werden, welche Ergebnisse/Zustände zu erwarten sind. Dazu integriert Nightwatch das Assertion Framework chai.js, womit die Keywords expect, should und assert zur Verfügung stehen. Gleichzeitig bietet chai.js einen sogenannten BDD-Codestil¹, welcher durch seine Verkettung von Füllwörtern nah an menschenlesbare Sprache herankommt und somit die Lesbarkeit und Verständlichkeit verbessert: browser.expect.element('#main').to.be.present;

¹ BDD steht für Behavior Driven Development und stellt einen Ansatz in der agilen Softwareentwicklung dar, der u.a. das Verwenden von menschenlesbaren Beschreibungen von Softwareanforderungen beinhält. Für mehr Informationen siehe https://www.chaijs.com/api/bdd/

Der Nightwatch-Inspektor

Ein einzigartiges Feature von Nightwatch stellt der Nightwatch-Inspektor dar. Mit diesem lassen sich die einzelnen Elemente von Webseiten untersuchen, ähnlich wie mit Entwicklertools von Browsern. Im sogenannten Explore Mode kann ein spezifisches Element angeklickt werden. Zu dem ausgewählten Element wird daraufhin im Inspektor ein Selektor angezeigt, der das Element identifiziert. Dies erleichtert es dem Entwickler, das gewünschte, zu testende Element zu benennen. Zudem besitzt der Inspektor ein Konsolenfeld mit Autocompletion, in dem sich Kommandos ausführen lassen. Mit dem zuvor ermittelten Selektor eines Elements lassen sich so entweder Informationen zu dem gewünschten Element abrufen oder das Element direkt manipulieren. Das Ergebnis der Manipulation wird dem Nutzer angezeigt. Der Inspektor von Nightwatch stellt somit eine Einstiegshilfe dar und bietet Zeitersparnis, was besonders für Anfänger attraktiv sein dürfte.

Setup von Nightwatch

Die Voraussetzung, um Nightwatch zu verwenden, ist eine aktuelle Version von Node. Wenn dies gegeben ist, sehen die Schritte zum Aufsetzen eines Nightwatch-Projekts wie folgt aus:

1. Installieren des Nightwatch-Pakets via npm

npm init nightwatch <dir>

2. Beantworten verschiedener Fragen, um Nightwatch zu konfigurieren (hier ein einfaches Beispiel)

? Select testing type to setup for your project: End-to-End testing
? Select language + test runner variant: TypeScript / default
? Select target browsers: Chrome, Firefox, Edge
? Enter source folder where test files are stored: testfiles
? Enter the base_url of the project: http://localhost
? Select where to run Nightwatch tests: On localhost

Daraufhin werden lediglich alle benötigten packages installiert sowie Dateien angelegt, bevor das Setup abgeschlossen ist. Darunter befinden sich auch Beispieltests, welche direkt im Anschluss ausgeführt werden können. Die Testergebnisse werden grafisch aufbereitet in der Konsole dargestellt.

Ein Beispiel, wie Testergebnisse in der Konsole ausgegeben werden.
Ein Beispiel für die Konsolenausgaben der ausgeführten Beispieltests für duckduckgo.com und google.com.

Selenium

Selenium stellt zunächst ein Framework zur Automatisierung von Browsern dar. Den häufigsten Anwendungsfall stellt dabei die Automatisierung für Testzwecke dar. Selenium entstand 2004 und ist wie Nightwatch ebenfalls Open Source.

Initial geschrieben für JavaScript, unterstützt Selenium heute viele Sprachen, darunter Java und Python. Der Entwickler hat mit Selenium also die Freiheit, sich eine Sprache auszusuchen, mit der er gut zurecht kommt.

Was einst als TestRunner für JavaScript begann, hat sich zu einem umfassenden Ökosystem entwickelt. Mit der Weiterentwicklung entstanden neben der Test-API (Selenium Core) weitere Projekte wie das Browser Add-on Selenium IDE zum Aufnehmen von Tests, Selenium Server/Grid für verteilte, parallelisierte Tests oder auch der Selenium WebDriver, der für alle gängigen Browser funktioniert. Das macht Selenium zu einem starken Tool, welches sich in der Praxis bewiesen hat. Doch wie kommt Nightwatch hier ins Spiel?

Wichtig zu verstehen ist, dass Selenium kein Testframework ist, es ermöglicht lediglich die Automatisierung von Browsern. Aus diesem Grund listet Selenium auf seiner offiziellen Webseite eine Reihe an Testframeworks auf, die mit Selenium verwendet werden können, dazu gehört auch Nightwatch.js.

Fazit

Nightwatch zeichnet sich durch seine Benutzerfreundlichkeit und Vielseitigkeit aus. Es ermöglicht das Durchführen einer breiten Palette von Tests, angefangen bei End-to-End-Tests bis hin zu Unit-Tests, und das in unterschiedlichen Umgebungen, sei es mobil oder im Web. Zusätzlich ermöglicht Nightwatch verschiedene Testmöglichkeiten, darunter Accessibility-Tests, visuelle sowie API-Tests.
Außerdem besonders hervorzuheben ist der Nightwatch-Inspektor, der das Identifizieren und Manipulieren von Testelementen im Web erheblich erleichtert.
Darüber hinaus punktet Nightwatch durch die Integration von Selenium Grid für Parallelisierung sowie die Möglichkeit, das Framework mit Cloud-basierten Testplattformen wie BrowserStack und SauceLabs zu verwenden.

Insgesamt präsentiert sich Nightwatch als ein robustes Test-Framework, das umfassende Testmöglichkeiten bietet und sowohl für erfahrene Entwickler als auch für Anfänger attraktiv ist. Nightwatch bietet seine eigene Implementierung des WebDrivers, kann aber durchaus mit Selenium verwendet werden, um Anwendungen und Webseiten automatisiert zu testen.