Automatisierter Drupal-Test: eine Einführung
Drupal-Experte Oliver Davies erläutert Methodik, Ansätze und Terminologie automatisierter Tests und untersucht, wie Sie ein neues Drupal-Modul mit einem testgetriebenen Entwicklungsansatz (TDD) erstellen können.
Was sind automatisierte Tests?
Automatisierte Tests sind eine Möglichkeit, um zu überprüfen, ob Ihr Code so funktioniert, wie Sie es erwarten.
Drupal 8 und 9 verwenden PHPUnit, d.h. dasselbe Test-Framework, das auch in anderen PHP-Frameworks wie Symfony und Laravel verwendet wird. Während des Lebenszyklus von Drupal 8 wurde besonderer Wert auf automatisiertes Testen im Drupal-Core gelegt, da alle neuen Funktionen und Fehlerbehebungen automatisierte Tests im Core erfordern und eine zunehmende Anzahl von Modulen das Gleiche tut.
Das Verfassen automatisierter Tests für unseren benutzerdefinierten Code ist sehr wichtig, da es zeigt, dass die Funktionalität intakt ist. Nicht nur während der Entwicklung der Tests und des Codes, sondern auch dann, wenn die Codebasis wächst und komplexer wird. Eine Veranschaulichung der Funktionalitäten unterstützt zudem, wenn sich Abhängigkeiten ändern, wie z.B. das Aktualisieren von Drupal selbst auf eine neue Minor- oder Major-Version.
Wenn ein Test, der zuvor bestanden hat, inzwischen fehlgeschlagen ist, muss er überprüft und korrigiert werden, bevor die Änderung auf die Website des Kunden übertragen wird.
Wie beginne ich mit automatisierten Tests in Drupal?
Der Drupal-Core enthält bereits das PHPUnit-Testing Framework, so dass es bereits vorhanden ist, wenn Sie Drupal herunterladen oder Drupal über den Composer installieren.
Innerhalb des 'Core'-Verzeichnisses gibt es eine Datei namens phpunit.xml.dist, die PHPUnit konfiguriert. Sie können Ihre eigene von Grund auf neu erstellen oder diese als Vorlage verwenden.
Als Minimum müssen Sie Angaben darüber machen, wie Sie sich mit der Datenbank verbinden können (die Tests müssen Drupal installieren können) und eine Basis-URL angeben, zu der Sie sich verbinden können (dies wird je nach Ihrer lokalen Umgebung unterschiedlich sein).
Sobald Sie Tests platziert haben, verfügt Drupal.org über ein Tool namens Drupal CI, das diese Tests automatisch ausführen kann. So können Sie sicher sein, dass ein übermittelter Patch sie nicht beschädigt hat und überprüft, ob neue Tests durchgeführt wurden oder nicht. Für Ihren benutzerdefinierten Code können Sie ein Tool wie GitHub Actions, Jenkins, Travis CI oder Circle CI verwenden, um dasselbe zu tun. Wir tun dies für jede Pull-Anfrage, genauso wie Drupal CI dies für jede Patch-Datei erledigt..
Was sind die Arten von automatisierten Tests in Drupal?
Die unterschiedliche Arten und die Nutzung von automatisierten Drupal-Tests und Ihre Verwendung sind abhängig davon, was Sie testen möchtenst.
- Funktionale Tests (Web, Feature): Diese testen das Verhalten und die Funktionalität von Drupal. Sie stellen HTTP-Anfragen an die Website und haben über den Service-Container Zugriff auf die Datenbank und andere Dienste. Diese Art von Test ist in der Durchführung verzögert
- FunctionalJavascript: Dies sind funktionale Tests, die jedoch Zugriff auf die Ausführung von JavaScript haben.
- Kernel (Integration): dieser Test hat keine Browser-Fähigkeiten, hat aber Zugriff auf die Datenbank und andere Dienste. Er erfordert etwas mehr Konfiguration als andere Testtypen.
- Unit: diese Art von Test hat keinen Zugriff auf die Datenbank oder den Service-Container, so dass alle Abhängigkeiten nachgestellt werden müssen. Diese Methode ist schnell auszuführen.
Wie sollte ich das automatisierte Testen von Drupal angehen?
Sie können Ihren Test in den folgenden Schritten strukturieren:
- Anordnen: Einrichten der Umgebung, Erstellen von Anwendern, Nodes und Einrichten von Abhängigkeiten
- Handeln: eine Handlung ausführen, z.B. auf eine Seite gehen
- Vergewissern Sie sich, dass etwas passiert ist, z.B. dass Sie einen bestimmten Antwortcode zurückerhalten oder dass Sie einen gewünschten Text auf der Seite sehen.
Verwenden Sie einen der folgenden Ansätze:
- Inside-out (Testpyramide): Hierbei handelt es sich meist um Unit-Tests, mit einigen Integrationstests und wenigen Funktionstests.
- Outside-in (Testtrophäe): Hierbei handelt es sich hauptsächlich um Funktionstests, mit einigen Integrationstests und wenigen Unit-Tests. Es ist flexibler und einfacher zu refaktorisieren.
Ich neige dazu, den Outside-In-Ansatz zu bevorzugen. Ich habe festgestellt, dass es so schneller geht, einen Test zu bestehen, und dass es einfacher ist, den Code zu überarbeiten.
Was ist testgetriebene Entwicklung?
Bei der testgetriebenen Entwicklung werden fehlgeschlagene Tests vor Ihrem Produktionscode geschrieben. Sie entwickeln einen Code, um den Test durchzuführen und refaktorieren, sobald der Test bestanden ist. Dies sollte zu einem gesäubertenprogrammiere, einfacheren Code führen, da Sie nur den Code programmiert haben, der zum Bestehen der Tests erforderlich ist.
Wenn Sie Uncle Bobs drei TDD-Gesetze befolgen, programmieren Sie nur so viel von einem Test, dass er fehlschlägt, und dann entwickeln Sie so viel Code, dass er erfolgreich ist. Sobald der Test bestanden ist, können Sie ihn refaktorieren und dann die Schleife erneut durchlaufen, indem Sie den gleichen Test weiter ausbauen oder einen neuen Test beginnen.
Schulung zum automatisierten Testen von Drupal am DrupalCamp London
Seit dem zweiten Jahr des DrupalCamp London bin ich ein regelmäßiger Teilnehmer und Referent. Ich bin auch ein Enthusiast für automatisierte Tests und schreibe oft zu diesem Thema. Als ich also angesprochen wurde, einen Workshop auf dem DrupalCamp London 2020 zu halten, hatte ich keine Probleme, mich auf ein Thema festzulegen!
Wenn ich Vorträge über automatisiertes Testen halte, beginne ich normalerweise damit, Konzepte und Ansätze zum Testen vorzustellen. Ich fahre damit fort, Leuten zu zeigen, wie man ein Blog-Modul in Drupal 8 erstellt, während ich Tests entwickle und testgetriebene Programmierung praktiziere (wobei die Tests vor dem Produktionscode geschrieben werden)
Ich beschloss, dasselbe für den DrupalCamp-Workshop in London zu tun. Anstatt alles anhand von Folien zu erklären, wollte ich praktische Anweisungen geben, die es den Teilnehmern ermöglichen, die Schritte in ihrem eigenen Tempo durchzuarbeiten. Dieser Ansatz würde es auch Remote-Teilnehmern ermöglichen, eine ähnliche Erfahrung zu machen.
Wenn Sie daran interessiert sind, zu lehren oder zu lernen, wie man automatisierte Tests mit Drupal 8 durchführt, dann lesen Sie der untenstehende "Lektionsplan" aus meinem DrupalCamp London-Workshop!
Sie können auch meinen kompletten Workshop-Plan und Übungen auf GitHub finden, zusammen mit dem Beispielcode, falls Sie diesen selbst durcharbeiten möchten.
Hier ist das, was enthalten ist:
Funktionstests für Drupal-Core-Funktionalität
- Lernen Sie, wie man einen Test schreibt und durchführt, und sehen Sie die Erfolgs- oder Fehlermeldungen.
Einen Blog erstellen
- Sobald Sie mit dem Testprozess zufrieden sind, können Sie mit dem Aufbau eines Blog-Moduls und der testgetriebenen Entwicklung outside-in beginnen.
- Starten Sie mithilfe der Akzeptanzkriterien erneut mit einem weiteren Funktionstest, um sicherzustellen, dass Ihre Blog-Seite tatsächlich existiert, und lassen Sie sich durch diese Tests dazu bringen, eine Routing-Datei und einen Controller für die Seite zu erstellen.
- Versuchen Sie, in dieser Phase einige TDD-Schleifen zu durchlaufen, lassen Sie fehlgeschlagene Tests bestehen, bevor Sie weitere Behauptungen hinzufügen, und durchlaufen Sie den Zyklus erneut.
- Wenn Sie damit zufrieden sind, dass anonyme Benutzer auf die Blog-Seite zugreifen und sie ansehen können, fahren Sie mit der Darstellung der Artikel selbst fort.
Testen mit einem Artikel-Repository
- Beginnen Sie sich mit Kernel-(Integrations-)Tests zu beschäftigen und wie Sie ein Artikel-Repository nutzen können. Blog-Beiträge können somit aus der Datenbank bezogen sowie andere Konzepte wie Dienste und automatische Verdrahtung untersucht werden.
- Testen Sie selbst eine Blog-Seite! Untersuchen Sie, wie Sie dies innerhalb Ihrer Tests tun können, indem Sie verschiedene Testklassen zum Erweitern und Funktionen zum Erstellen einiger Artikel verwenden. Lesen Sie einige der kryptischeren Fehlermeldungen, die Sie manchmal bei Kerneltests erhalten, und gehen Sie sie an.
- Wenn Sie den korrekten Inhalt zurückgegeben haben, versuchen Sie, einige zusätzliche Tests hinzuzufügen, um sicherzustellen, dass nur veröffentlichte Artikel geliefert werden und dass sie in der gewünschten Reihenfolge angezeigt werden. Verwenden Sie diese, um Ihr Blog-Repository zu verbessern und es weniger anfällig zu machen.
Fazit
Es war wirklich von unschätzbarem Wert, eine Reihe von automatisierten Tests zu haben, während ich Module entwickle und pflege. Es hat mir die Sicherheit gegeben, neue Funktionen hinzuzufügen, Fehler zu beheben und Code zu refaktorisieren - ohne mir Sorgen machen zu müssen, dass viele Drupal-Websites beschädigt werden!
Je mehr Tests Sie entwickeln, desto sicherer können Sie sein, dass Ihr Code korrekt funktioniert. In meinem Fall bedeutet das eine bessere Qualität für meine Kunden..
Automatisierte Tests ermöglichen es Ihnen auch, Fehler in Ihrem benutzerdefinierten Code zu verhindern und zu identifizieren. Diese können schnell lokal behoben werden, bevor sie bis zu einer Code-Überprüfung oder auf die Live-Site eines Kunden gelangen, das möglicherweise mehr Probleme verursachen würde.
Ich hoffe, dass dieser Beitrag zusammen mit meinem DrupalCamp-Lektionsplan Ihnen die Tools und das Selbstvertrauen gibt, das Testen in die Praxis umzusetzen und noch heute mit der Entwicklung besserer Codes zu beginnen.
Über den Autor
Oliver ist ein Full-Stack-Software-Ingenieur und arbeitet seit 2007 mit Drupal. Er ist ein Acquia-zertifizierter Drupal 8-Grand Master, Core Contributer und beitragender Projektbetreuer. Digitale Zugänglichkeit war noch nie so wichtig wie heute, da der Coronavirus unser Leben online dominiert.