Kolumne: Quality Time

Akzeptanz testen
Kommentare

Unit Tests gehören mittlerweile zum guten Ton jedes PHP-Projekts. Doch Unit Tests bringen lediglich die technische Korrektheit einer Software voran. Ob das, was die Entwickler programmieren, auch dem entspricht, was der Project Owner sich vorstellt, steht auf einem anderen Blatt. Ansätze aus dem Bereich des Domain-driven Designs (DDD) [1] versuchen solche Kommunikationsprobleme an der Schnittstelle zwischen Auftraggebern und Technikern auszumerzen. Hierzu zählt auch die Methodik des Behavior-driven Developments (BDD) [2]: Von Menschen lesbare Akzeptanzszenarien werden als Testfälle ausführbar gemacht, um das gewünschte Verhalten der Applikation zu validieren.

Mit Behat [3] steht der PHP-Welt ein passendes Tool zur Verfügung, um diese Methodik anzuwenden. Daneben bietet es eine nützliche Plattform für verschiedene Arten von Funktions- und Systemtests.

Scenario: If there are no CFPs, I see an empty list.
Given there are no CFPs
When I view "CFP Listing"
Then I see 0 CFPs listed

Das gezeigte Listing sieht auf den ersten Blick aus wie eine rudimentäre Userstory. Allerdings ist nur die erste Zeile Fließtextdokumentation, die weiteren drei Zeilen werden durch Behat zu ausführbarem Code. Und genau darin liegt der Charme: Der Auftraggeber des Projekts kann die so notierte Spezifikation lesen, verstehen und mit den Entwicklern diskutieren. Anschließend dient die abgesegnete Spezifikation als Testfall, um sicherzustellen, dass die Anwendung die Geschäftsanforderung auch erfüllt.

Natürlich kann Behat solchen Text nicht auf Anhieb verstehen. Deshalb muss, um einen solchen Testfall ausführbar zu machen, jeder verwendete Satz mit Code verknüpft werden, der den gewünschten Effekt in der Applikation erzeugt. Dies kann beispielsweise so aussehen:

class ListingFeatureContext extends BehatContext 
{ 
  // ... 
  /** 
  * @Given /^there are no CFPs$/ 
  */ 
  public function thereAreNoCfps() 
  { 
    $this->cleanupDatabase(); 
  } 
}

Zur Integration des eigenen Testcodes in Behat wird die Klasse BehatContext erweitert. In einem solchen Context ist es mithilfe von Annotationen und regulären Ausdrücken möglich, einen Satz mit einer Methode zu verknüpfen. Immer wenn Behat den entsprechenden Satz in einem Testszenario findet, führt es die passende Methode aus. Hier wird also beispielsweise die Testdatenbank geleert, wenn der Satz „Given there are no CFPs“ auftaucht.

Das hier gezeigte Beispiel ist aus Platzgründen nur sehr rudimentär. Behat bietet viele weitere Features wie Parameter in Sätzen, Beispieltabellen und modulare Erweiterungen. Eine davon basiert auf Mink [4] und stellt spezielle Sätze für Webakzeptanztests sowie die Infrastruktur zur Emulation und Fernsteuerung von Browsern bereit. Eine andere Erweiterung erlaubt die einfache Integration mit Symfony2-basierten Projekten [5].

Eine vorschnelle Einführung von BDD und Behat birgt allerdings auch Risiken: Häufig nötiges Refactoring der Sätze kann zu gravierendem Implementierungs-Overhead führen und die fehlende Bereitschaft einzelner Projektmitglieder zur Teilnahme am BDD-Prozess kann diesen schnell torpedieren. Richtig angewendet bietet die Methodik des BDDs aber viel Potenzial, um die Kommunikation zwischen Technikern, Analysten und Auftraggebern zu optimieren. Behat als Framework für Akzeptanztests kann auch unabhängig von BDD auf der rein technischen Seite eines Projekts hilfreich sein: Beispielsweise in der Entwicklung von Systemtests für Legacy-Code, um diesen anschließend refaktorisieren zu können.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -