Pasar al contenido principal

Testen von Drupal-Projekten mit Behat in PhpStorm

19. Julio 2015

Testen von Drupal-Projekten mit Behat in PhpStorm

by Jürgen Haas
Behat 1

Entwickler sind dafür bekannt, dass ihre bekanntesten Themen Testen und Dokumentation sind - nicht. Und ich bin da nicht anders. Doch je größer meine Projekte werden und je länger sie dauern, desto mehr wird dies zu einem echten Thema, so dass sogar der Entwickler in mir anfängt, die Idee des richtigen Testens und Dokumentierens zu fördern. Und um es kurz zu machen: BDD (Behaviour Driven Development) kann in diesen beiden Bereichen einen wichtigen Beitrag leisten.

Der Zweck dieses Blogbeitrags ist es, einige Best Practices für das Testen von Drupal-Projekten mit Behat für Entwickler zu demonstrieren, die PhpStorm (oder eine gleichwertige IDE von JetBrains wie z.B. IntelliJ IDEA) verwenden. Es gibt eine Vielzahl von Artikeln, Tutorials und Blogbeiträgen zu diesem Thema, von denen Sie unten einige Links finden. Die Anforderung für diesen zusätzlichen Beitrag wurde durch meine eigene Erfahrung angetrieben, dass eine effiziente Einrichtung, Testarchitektur und Automatisierung noch nicht von Anfang bis Ende beschrieben wurde. Das folgende Tutorial spiegelt also meine ganz eigene und persönlich bevorzugte Art und Weise wider, diese großartigen Tools zu nutzen, und es würde mich nicht überraschen, wenn jemand andere Wege findet, dies zu tun. Ich wäre sogar daran interessiert, sie kennenzulernen.

Warum Behat?

Der Schwerpunkt lag zunächst auf PHP, und als wir uns nach möglichen Frameworks umsahen, erwiesen sich PhpSpec, Codeception und Behat als hervorragende Kandidaten für die Aufgabe. Die Tatsache, dass wir nur Drupal-Projekte testen wollten und dass es eine gut gepflegte Drupal-Erweiterung für Behat gibt, die auch Drush in das Framework integriert, machte die Wahl recht einfach und keiner der Tests mit einer der drei Plattformen brachte große Argumente für eine der anderen hervor. Nicht zuletzt funktioniert auch die Behat-Integration in PhpStorm sehr gut, so dass alles gut integriert wurde und sich als perfekte Ergänzung für unsere Arbeitsumgebung erwies.

Installation

Hier ist eine Schritt-für-Schritt-Anleitung, wie man alle Komponenten installieren kann. Die Anweisungen für die Kommandozeile wurden auf Ubuntu 15.04 getestet, sollten aber auch für andere Plattformen mehr oder weniger gleich sein.

Composer installieren

Dies ist optional und nur erforderlich, wenn Composer noch nicht auf Ihrem System installiert ist:

sudo curl -s https://getcomposer.org/installer | sudo php

Um sicherzugehen, dass Ihr Composer auf dem neuesten Stand und so aktuell wie möglich ist, sollten Sie folgendes ausführen

sudo composer self-update

Vor allem, wenn er bereits auf Ihrem System installiert wurde.

Anforderungen definieren

Als nächstes teilen wir dem Composer mit, welche Komponenten wir für unsere Testumgebung benötigen:

sudo composer global require behat/behat ~3.0.15
sudo composer global require drupal/drupal-extension ~3.0
sudo composer global require feature-browser/Feature-Browser ~1.0
sudo composer global require drush/drush ~7.0
sudo composer global require ciaranmcnulty/behat-stepthroughextension dev-master

Schließlich muss composer alle erforderlichen Komponenten installieren (oder aktualisieren):

sudo composer global update

Das kann eine Weile dauern, gehen Sie eine Tasse Kaffee trinken, es wird bald spannend.

Konfiguration

Bevor wir uns an die Konfiguration der IDE machen, müssen wir sicherstellen, dass PHP damit zurechtkommt und eine winzig kleine Änderung an der php.ini vornehmen:

xdebug.max_nesting_level = 1000

Dies ist erforderlich, da der Standardwert auf 100 gesetzt ist und dies für die Bedürfnisse von Behat nicht ausreicht.

Nun ist es an der Zeit, PhpStorm für Behat fit zu machen. Vielleicht möchten Sie einen Blick in den JetBrains Blog Post werfen, um herauszufinden, wie man anfängt, aber ich habe einige zusätzliche Schritte gefunden, die wirklich hilfreich, wenn auch nicht erforderlich sind, daher führe ich sie alle kurz auf, damit Sie eine umfassende Liste aller notwendigen Schritte erhalten:

Behat-Plugin aktivieren

Gehen Sie zu Datei > Einstellungen und öffnen Sie dort den Abschnitt Plugins. Finde das Behat-Plugin und aktiviere es.

PHP Intepreter festlegen

Gehen Sie zu Datei > Einstellungen und öffnen Sie dort den Abschnitt Sprachen und Frameworks > PHP. Legen Sie das Sprachniveau und den Interpreter fest, den Sie in Ihrem Projekt verwenden möchten.

Behat 2

Kompositor konfigurieren

Gehen Sie zu Datei > Einstellungen und öffnen Sie dort den Abschnitt Sprachen und Frameworks > PHP > Composer. Geben Sie die Pfade zu Ihrem Composer und Ihrer globalen composer.json-Datei an.

Behat 3

Bibliotheken hinzufügen

Bibliotheken werden in der Datei > Projektstruktur hinzugefügt und Sie sollten alle installierten Bibliotheken hinzufügen, wie im folgenden Beispiel gezeigt.

Behat 4

Ausführungskonfiguration festlegen

Bevor Sie Ihre Laufkonfiguration definieren können, sollten Sie ein Verzeichnis in Ihrem Projekt erstellen, das für Ihre Testspezifikationen verwendet wird. Innerhalb dieses Verzeichnisses sollten Sie eine Datei behat.yml erstellen, die vorerst leer bleiben kann, wir werden uns später damit beschäftigen. Nun ist alles vorbereitet, um Ihre Laufkonfiguration zu definieren. Sie finden diese in einem Dropdown-Menü in Ihrer Symbolleiste mit der Bezeichnung Konfigurationen bearbeiten... und können eine neue Konfiguration wie folgt hinzufügen:

Behat 5

Unten sehen Sie eine Fehlermeldung und wenn Sie auf die Schaltfläche "Fix" klicken, können Sie die endgültige Konfiguration vornehmen:

Behat 6

Klicken Sie auf OK und noch einmal auf OK in dem darunter liegenden Dialog, jetzt können Sie loslegen.

Tests schreiben

In Ihrem Testverzeichnis sollten Sie eine Struktur wie die hier gezeigte anlegen:

Behat 7

Lassen Sie uns also besprechen, was in diesen Testdefinitionen steht:

Hauptdatei behat.yml

default:
  suites:
    default:
      Kontexte:
        - FeatureContext
        - Drupal\DrupalErweiterung\Kontext\DrupalKontext
        - Drupal\DrupalErweiterung\Kontext\DrushContext
        - Drupal\DrupalErweiterung\Kontext\MarkupKontext
        - Drupal\DrupalErweiterung\Kontext\MessageContext
        - Drupal\DrupalErweiterung\Kontext\Minkontext
        - Drupal\DrupalErweiterung\Kontext\RawDrupalContext
  Erweiterungen:
    Behat\MinkExtension:
      Goutte: ~
    Drupal\DrupalExtension:
      Blackbox: ~
      api_driver: "drush"
      drupal:
        drupal_root: "/var/www/test"
      Unterkontexte:
        paths:
          - "/var/www/test/sites/all/modules"
      region_map:
        Erste Seitenleiste: "#sidebar-first"
        Hauptinhalt: "#main .region"
      Selektoren:
        message_selector: ".messages, #absolute-messages-messages"
        error_message_selector: "#absolute-messages-messages .absolute-messages-error, .alert.alert-danger"
        success_message_selector: "#absolute-messages-messages .absolute-messages-status .content, #status-message-container .messages.status, .alert.alert-success"
      text:
         log_out: "Abmelden"
         log_in: "Anmelden"
         passwort_feld: "Passwort"
         benutzername_feld: "Benutzername oder E-Mail Adresse"

MainTest:
  Suites:
    Standard:
      Pfade:
        - %paths.base%/features/basic
        - %pfade.basis%/eigenschaften/spezifisch1
  Erweiterungen:
    Behat\MinkExtension:
      base_url: "http://site1.localhost"
    Drupal\DrupalExtension:
      drush:
        alias: "site1"

SubTest:
  Suites:
    Standard:
      Pfade:
        - %paths.base%/features/basic
        - %pfade.basis%/eigenschaften/spezifisch2
  Erweiterungen:
    Behat\MinkExtension:
      base_url: "http://site2.localhost"
    Drupal\DrupalExtension:
      drush:
        alias: "site2"

Dies ist die Hauptkonfiguration der Testsuite, die 3 Profile enthält: default, MainTest und SubTest. Die beiden nutzbaren Profile MainTest und SubTest verwenden selbst das Standardprofil und erweitern es um ihre spezifischen Einstellungen.

Jedes der Profile kommt mit einer Standardsuite, die eine Liste von Pfaden definiert, die für jedes dieser Profile getestet werden sollen. Der MainTest verwendet daher alle Feature-Dateien im Unterverzeichnis features/basic, gefolgt von allen Feature-Dateien im Unterverzeichnis features/specific1.

Auf diese Weise können Sie im Basisverzeichnis Tests schreiben, die für jedes Profil verwendet werden, und in jedes der spezifischen Verzeichnisse nur die Tests für einige der Profile schreiben.

Alle weiteren Einstellungen in der Datei behat.yml sind in den Dokumentationen für Behat und die DrupalExtension ausführlich dokumentiert und werden hier der Einfachheit halber nicht wiederholt.

Kontextdatei FeatureContext.php


use Behat\Behat\Context\SnippetAcceptingContext;
use Drupal\DrupalExtension\Context\RawDrupalContext;
/**
 * Definiert Anwendungsmerkmale aus dem spezifischen Kontext.
 */
class FeatureContext extends RawDrupalContext implements SnippetAcceptingContext {
  /**
   * Initialisiert den Kontext.
   *
   * Jedes Szenario erhält seine eigene Kontextinstanz.
   * Sie können auch beliebige Argumente an den
   * Kontext-Konstruktor über die Datei behat.yml übergeben.
   */
  public function __construct()
  {
  }
  /**
   * @BeforeStep
   */
  public function beforeEachStep($event) {
  }
  /**
   * @AfterStep
   */
  public function afterEachStep($event) {
  }
}

An dieser Stelle können Sie Ihre eigenen Schrittdefinitionen schreiben und sich in das Standardverhalten von Behat einklinken. Eine ausführliche Dokumentation finden Sie unter Behat, und Sie sollten sich dort über alle Details informieren, die Sie speziell benötigen.

Funktionen in basic/anonymous.feature

Feature: Anonyme Benutzertests
  Um die Daten des Unternehmens und seiner Kunden zu schützen
  Als anonymer Benutzer
  Ich möchte sicherstellen, dass keine Daten für anonyme Besucher zugänglich sind

  Hintergrund:
    Da ich nicht eingeloggt bin

  Szenario: Allgemeine Verfügbarkeit der Website prüfen
    Wenn ich auf "Benutzer" bin
    Dann sollte ich den Text "Benutzerkonto" sehen
    Und ich sollte nicht den Text "Zugriff verweigert" sehen

  Szenario: Testen des Benutzeranmeldeformulars und der Fehlermeldungen
    Wenn ich auf "Benutzer" bin
    Und ich drücke auf "Anmelden"
    Dann sollte ich die folgenden Fehlermeldungen sehen:
      | Fehlermeldungen |
      | Benutzername oder E-Mail Adresse ist erforderlich |
      | Passwortfeld ist erforderlich |
    Und ich sollte die folgenden Fehlermeldungen nicht sehen:
      | Fehlermeldungen |
      | Sorry, unerkannter Benutzername oder Passwort |
      | E-Mail kann nicht gesendet werden. Wenden Sie sich an den Administrator der Website, wenn das Problem weiterhin besteht.

  Skizze des Szenarios: Stellen Sie sicher, dass bestimmte URLs nicht verfügbar sind
    Wenn ich auf "[url]" bin
    Dann sollte ich eine "403" HTTP-Antwort erhalten
    Und ich sollte den Text "Zugriff verweigert" sehen
    Beispiele:
      | url |
      | admin |
      | node/add |
      | user/1 |

Eine Beispiel-Feature-Datei, um eine erste Reihe von Szenarien zu definieren, die Sie wahrscheinlich auf jeder Drupal-Site testen möchten. Es ist nur eine schnelle Startdatei, aber diese Tests sind bereits wichtig, um sicherzustellen, dass Ihre Drupal-Site nicht falsch konfiguriert ist. In allen anderen Verzeichnissen können Sie nun eine beliebige Anzahl von Feature-Dateien erstellen, die alles enthalten, was Sie testen wollen. Ich frage mich nur, ob die Gemeinschaft nicht anfangen sollte, an einem grundlegenden Satz von Tests zusammenzuarbeiten - aber das ist ein Thema für eine andere Diskussion an anderer Stelle, denke ich.

Andere nützliche Tools für den Einstieg in Behat und Drupal

Umgebungsvariablen für die Behat-Drupal-Erweiterung generieren

Es gibt eine nette Funktion in Behat, die es erlaubt, bestimmte Teile der Konfigurationsdatei behat.yml wegzulassen und stattdessen diese Teile mit einer Umgebungsvariablen $BEHAT_PARAMS zu definieren. Diese Variable sollte ein einzeiliger json-String sein und könnte zum Beispiel die Basis-URL oder den Drupal-Root-Pfad enthalten. Da es ziemlich schwierig ist, eine solche Umgebungsvariable von Hand zu definieren, gibt es dafür ein Tool: Drush Befehl bde_env_gen.

Debugging-Funktionen

Ok, es ist möglich, PHP-Cli-Anwendungen mit XDebug und PhpStorm zu debuggen, aber das kann schwierig sein und erfüllt vielleicht nicht einmal Ihre Anforderungen, da Sie nicht die Behat-Anwendung debuggen wollen, sondern sehen wollen, was mit Ihrer Drupal-Site passiert, während Sie durch die Funktionen und Szenarien gehen. Dafür gibt es die Behat Step Through Extension. Wenn sie aktiviert ist, hält Behat nach jedem Schritt an und wartet darauf, dass Sie bestätigen, dass es weitergehen soll. So können Sie in der Zwischenzeit so lange wie nötig den Kontext der Website, die Logs, das Dateisystem oder die Datenbank überprüfen, bevor Behat mit dem nächsten Schritt weitertestet.

Dokumentation Ihrer Website auf der Grundlage Ihrer Tests

Und last but not least: Wenn Ihre Tests eine umfassende Beschreibung dessen sind, wie Besucher, Redakteure, Administratoren und andere Rollen Ihre Website nutzen sollen, dann ist das auch eine vollständige Dokumentation des Projekts, die Sie Ihrem Kunden aushändigen wollen. Sie beschreibt, was der Benutzer der Website tun soll und was er oder sie von der Website als Antwort erwarten kann. Nun, ja, aber die Funktionsdateien - auch wenn sie reinen Text enthalten und beschreibend sind - sind immer noch kein Format, das man Projektmanagern oder sogar leitenden Angestellten aushändigen würde. Die Antwort, um diese Lücke zu schließen, ist unsere letzte Empfehlung für heute, FeatureBrowser. Es handelt sich dabei um ein Tool, das Ihre Funktionen analysiert und in eine Dokumentations-Website im HTML-Format umwandelt, in der jeder leicht navigieren und sie erkunden kann. Und da Sie es zusätzlich zu all Ihren Tests kostenlos erhalten, sollten Sie es vielleicht auch einmal ausprobieren.

Sie sind bis hierher gekommen und lesen immer noch? Respekt, Sie sind wirklich interessiert. Wir hoffen, Ihnen gefällt, was Sie hier gefunden haben, und wir freuen uns über Ihr Feedback, Ihre Vorschläge und Ihre Kritik in den Kommentaren unten.

Nützliche Links

Tools

Añadir nuevo comentario

Texto sin formato

  • No se permiten etiquetas HTML.
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.
CAPTCHA
Esta pregunta es para comprobar si usted es un visitante humano y prevenir envíos de spam automatizado.