Was sind Behat Tests?

Nicht nur in Drupal Projekten kommt es vor, dass neuer Code Fehler aufweisen kann. Das kann z.B. schnell passieren wenn der Entwickler nach dem Testen noch eine kleine Unschönheit im Code bemerkt und diese vermeintlich korrigiert ohne Änderungen an der FunktionalitĂ€t zu machen, aber aus ZeitgrĂŒnden nicht noch einmal testet. Noch schwerer ohne Tests abzudecken ist, wenn der neue Code versehentlich nicht nur Änderungen an der gewĂŒnschten Stelle verursacht sondern, alte FunktionalitĂ€t verĂ€ndert. Denn wer hat schon Zeit nach jeder Änderung alle FunktionalitĂ€ten in dem Projekt zu testen? Genau deshalb sollen automatische Tests ĂŒberprĂŒfen ob der neue Code seinen Zweck erfĂŒllt und auch keine unbeabsichtigten Änderungen an der bisherigen FunktionalitĂ€t macht.

Der große Vorteil von Tests ist, dass man sie automatisiert ausfĂŒhren kann und somit im Endeffekt Zeit sparen kann und nebenbei noch Seiteneffekte frĂŒhzeitig erkennen kann.

Behat Tests sind Teil des Behavior-Driven Developments (BDD) und basieren darauf, dass man das testet, was auch die Nutzer tun wĂŒrden. Genauer wird in Behat Tests eine Userstory in Text form festgehalten, die beim ausfĂŒhren des Tests automatisch durchgefĂŒhrt wird. Ob der Test erfolgreich ist oder nicht, hĂ€ngt von den angegeben Erwartungen ab.

Wie sieht ein Behat Test aus?

Behat Tests werden in Gherkin geschrieben. Die konkreten TestablÀufe werden in verschiedene Features gegliedert. Diese Features sollen ungefÀhr eine FunktionalitÀt der Webseite abdecken. Verschiedene Userstories werden in so genannte Scenarios gegliedert. Ein einfaches Beispiel wÀre:

Feature: basic functionallity # Dieser Test prĂŒft ob der Aufruf der Webseite einen # 200er response code (=Erfolgreich) liefert. Scenario: Working homepage Given I am on the homepage Then I should get a "200" HTTP response # Dieser Test prĂŒft ob auf der Webseite ein body # element vorhanden ist. Scenario: Markup on homepage Given I am on the homepage Then I should see an "body" element

Sowohl die Namen der Szenarien als auch der Features haben keine Auswirkungen auf den Testablauf und dienen nur der Übersicht und VerstĂ€ndlichkeit.

Hier eine kleine Übersicht ĂŒber die wichtigsten SchlĂŒsselwörter eines Behat Tests:

Given - Ausgangspunkt fĂŒr die Userstory / Wo soll etwas passieren.
When - Was soll gemacht werden? z.B. FĂŒlle in das Registrierungsformular folgende werte...
Then - Was soll geschehen / Worauf soll geprĂŒft werden?
And - Ein weiteres When/Given/Then

Wie schreibe ich einen Behat Test?

Am besten ist es, wenn man den Test mit schon vorhandenen SĂ€tzen ausdrĂŒcken kann um eine Liste von möglichen SĂ€tzen zu erhalten kann mann durch


behat -dl

erhalten. Sollte das nicht möglich sein, so kann man den Test trotzdem erst einmal mit SĂ€tzen schreiben, die man anschließend implementiert.

Scenario: Working homepage Given I am on the homepage and i am drunk Then I should get a "200" HTTP response

Sehr praktisch dabei ist, dass der Test schon ausgefĂŒhrt werden kann. Und beim AusfĂŒhren gleich der nötige Code um die Funktion zu implementieren ausgegeben wird:

You can implement step definitions for undefined steps with these snippets: /** * @Given /^I am on the homepage and i am drunk$/ */ public function iAmOnTheHomepageAndIAmDrunk() { throw new PendingException(); }

kopiert man diesen Code in die featureContext.php so sorgt der Wurf der PendingException dafĂŒr, dass der Test als "pending" gewertet wird und der Test weiterhin gelb markiert bleibt. Nun muss "nur" noch die passende Logik implementiert werden.

Um einen Fehler zu schmeißen kann man einfach


throw new \Exception('Explenation...');

verwenden. Um beispielsweise innerhalb der Implementierung eines Then Schritts einen anderes Then zu verwenden kann man ein neues Objekt erstellen:


Step\Then('the "style" element should contain ".css"');

Dieses wird dann als ganz normaler Schritt beim AusfĂŒhren des Tests aufgelistet.

KomplexitÀt der Tests

Behat Tests sollten wichtige FunktionalitÀt des Projekts abdecken wie z.B. "können anonyme Benutzer auf das Registrierungsformular?", "Bekommen sie nach abschicken des Registrierungsformulars eine E-Mail mit Aktivierungslink?", "werden sie beim aufrufen des Aktivierungslinks auch entblockt?".

Behat Tests sind nicht unbedingt dafĂŒr geeignet um alle Möglichkeiten abzudecken was Nutzer in einem bestimmten Fall tun könnten. Wenn es z.B. darum geht um zu testen ob bei einer LĂ€nderauswahl auch nur die zugehörigen Postleitzahlen valide Eingaben sind ist das eher ein Anwendungsfall fĂŒr einen YSimpleTest. Es muss also immer ein sinnvoller Kompromiss gefunden werden zwischen der Abdeckung des Tests und dem Nötigen Aufwand den Test zu schreiben.

Am Ende möchte ich eine Übersicht ĂŒber wichtige Anlaufstellen fĂŒr Dokumentation und Beispiele machen:

Projektseite http://behat.org/
Gute Anlaufstelle fĂŒr die Installation von behat und grundlegende verwendung von behat.

Drupalextension https://github.com/jhedstrom/drupalextension
Projektseite der Drupalextension mit Dokumenattion.

Profilbild Dominik Wille

Dominik Wille

Entwickler