© istockphoto.com/antishock
End-to-End-Tests für AngularJS mit Protractor

End-to-End


AngularJS ist gut zu testen, das ist mittlerweile bekannt. Und auch, dass es eine hervorragende Infrastruktur zur Formulierung von Unit Tests gibt. Jedoch sind Unit Tests nur die halbe Miete zur Absicherung von Applikationen, und aus diesem Grund beschäftigt sich dieser Artikel mit einer weiteren Art des Testens von AngularJS-Applikationen: den End-to-End-Tests mit Protractor.

Wenn Sie sich jetzt die Frage stellen, was genau End-to-End-Tests sind, warum Sie diese überhaupt benötigen und wie sie sich in Ihre Applikation integrieren lassen, dann sind Sie hier genau richtig.

Was ist ein End-to-End-Test?

Ein End-to-End-Test prüft im Gegensatz zum Unit Test nicht nur einen kleinen Ausschnitt Ihrer Applikation, sondern einen kompletten Workflow oder eine in sich geschlossene Funktionalität. Damit ersetzen sie keinesfalls Unit Tests, sondern bilden lediglich eine zusätzliche Ebene der Qualitätssicherung und sollen manuelle Tests von Funktionen in einer Applikation ersetzen.

Diese manuellen Tests sind lediglich bei kleinen Applikationen mit einem geringen Funktionsumfang praktikabel. Wächst allerdings der Funktionsumfang, können die Features nicht mehr in akzeptabler Zeit von Hand getestet werden. In diesem Fall beschränken sich viele Entwickler und Tester darauf, nur modifizierte Bereiche einer Applikation zu prüfen, was allerdings schwerwiegende Konsequenzen nach sich ziehen kann, wenn sich eine Codeänderung auf andere Bereiche der Applikation auswirkt, die nicht offensichtlich sind. Die ersten guten Gründe für End-to-End-Tests sind also Zeitersparnis beim Testen von Features und Sicherheit, wenn es um die Funktionstüchtigkeit von Teilen der Applikation geht.

Ein weiterer Aspekt, der für End-to-End-Tests spricht, ist, dass sie nicht so nah am Quellcode der Applikation angesiedelt sind wie Unit Tests. Ein klassischer Unit Test sichert eine Funktion oder eine bestimmte Komponente einer Applikation ab. Das bedeutet, dass Sie hier schon in der Struktur des Quellcodes stecken. Ein End-to-End-Test ist ein Blackbox-Test – hier interessiert es Sie nicht, wie der Quellcode strukturiert ist oder welche Funktionen oder Services es gibt. Es ist nur relevant, ob ein bestimmtes Feature funktioniert; und zwar einmal quer durch die Applikation vom Frontend bis zum Server. Mit dem Fokus auf der Funktionalität der Applikation gleichen die End-to-End-Tests eine entscheidende Schwachstelle von Unit Tests aus – Unit Tests prüfen nur einzelne Komponenten, nicht aber ihr Zusammenspiel in der Applikation und genau das steht bei den End-to-End-Tests im Mittelpunkt. So können sie helfen, Fehler aufzudecken, die bei der Integration von Codefragmenten auftreten.

Den bereits erwähnten Vorteilen stehen einige Nachteile von End-to-End-Tests gegenüber. Zunächst gilt für diese Art der Tests, was auch für alle anderen Tests gilt: sie kosten. Ein End-to-End-Test muss konzipiert und umgesetzt werden. Ändern sich die Anforderungen an die Applikation, müssen auch die End-to-End-Tests aktualisiert werden, was zusätzlichen Aufwand bedeutet. Sehr spezifisch für End-to-End-Tests ist hingegen der Aufwand, der betrieben werden muss, um sie auszuführen. Wo Unit Tests bewusst leichtgewichtig gehalten werden und sämtliche Abhängigkeiten durch Stubs ersetzt werden, läuft bei End-to-End-Tests die komplette Applikation. Das bedeutet für Sie, dass Sie mindestens ein komplettes Testsystem vorhalten müssen, auf dem Sie die End-to-End-Tests regelmäßig ausführen. Im Idealfall verfügt jeder Entwickler auch noch über eine Umgebung, in der sich die Tests ausführen lassen. Denn auch hier gilt: Je einfacher es ist, die Tests auszuführen, desto öfter kommen sie zum Einsatz und desto besser werden sie gewartet. Nachdem die Tests mit der vollständigen Applikation im Hintergrund ablaufen, ist die Rückmeldung der Tests nicht so unmittelbar wie bei Unit Tests, deren Laufzeit in der Regel nur wenige Sekunden in Anspruch nimmt. Diese Verzögerung rührt daher, dass mit dem Server kommuniziert, die Datenbank befragt und die Rückmeldung des Servers dargestellt werden muss. Außerdem haben End-to-End-Tests meist einen größeren Umfang als einfache Unit Tests.

Protractor

Nach dieser allgemeinen Einführung in End-to-End-Tests erfahren Sie nun mehr über den Test Runner, der Ihnen die Formulierung von End-to-End-Tests für AngularJS ermöglicht. Der erste öffentliche Commit in das Protractor Repository stammt von Julie Ralph, einer Entwicklerin von Google, die an Protractor arbeitet, im Januar 2013. Das erste Release von Protractor folgte im Juli 2013. Protractor sollte den Angular Scenario Runner ablösen, der bis dahin zur Erstellung von End-to-End-Tests verwendet wurde. Mittlerweile befindet sich der Scenario Runner nur noch im Maintenance-Modus, und Protractor ist das Werkzeug der Wahl, wenn es um die Erstellung von End-to-End-Tests für AngularJS geht.

Protractor ist in Node.js geschrieben und setzt auf WebDriverJS – beziehungsweise WebdriverIO, wie das Projekt mittlerweile heißt – auf. WebdriverIO stellt die Bindings für Selenium 2.0 für Node.js bereit. Damit können Sie mit JavaScript über die Selenium-Infrastruktur Browser fernsteuern. Für jeden Browsertypen benötigen Sie eine Erweiterung für Webdriver, damit er die Kontrolle über den Browser übernehmen kann – aber dazu später mehr. Die Tests selbst formulieren Sie dann in Jasmine, das durch Protractor um einige Kommandos erweitert wird. Falls Sie also schon Unit Tests für Ihre AngularJS-Applikationen mit Jasmine schreiben, müssen Sie keine neue Syntax lernen.

Installation von Protractor

Bevor Sie mit dem Schreiben Ihrer End-to-End-Tests beginnen können, müssen Sie zunächst Protractor auf Ihrem System installieren. Da das Werkzeug auf Node. js basiert, können Sie zur Installation auf den npm, den Node Package Manager, zurückgreifen. Die Installation erfolgt mit dem Kommando npm install --g protractor. Die Option --g sorgt dafür, dass Protractor systemweit als Kommandozeilenwerkzeug zur Verfügung steht. Unter Umständen benötigen Sie Administratorberechtigung auf Ihrem System, da das Werkzeug in einem Systemverzeichnis gespeichert wird.

Der npm installiert Protractor und alle erforderlichen Abhängigkeiten. Sie können die Installation ganz einfach testen, indem Sie auf der Kommandozeile den Befehl protractor --version eingeben. Als Ausgabe erhalten Sie die Versionsnummer Ihrer Protractor-Installation.

Neben Protractor selbst müssen Sie sich auch noch darum kümmern, dass Sie über einen funktionierenden Selenium-Server verfügen, der Ihnen die Infrastruktur für die Browsersteuerung bietet. Zu diesem Zweck erhalten Si...

Neugierig geworden? Wir haben diese Angebote für dich:

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