Test Driven Development mit Zend Framework und PHPUnit

In den letzten paar Tagen ging ich das Zend Framework durch und war angenehm überrascht, als ich vor der aktuellen Erweiterung der Zend_Test Komponente stand. Die Besonderheiten der Zend_Test Komponente sind die beiden Erweiterungen für PHPUnit, nämlich die Zend_Test_PHPUnit und Zend_Test_PHPUnit_Db. Zend_Test_PHPUnit bietet einen Testfall, der eine Vielzahl an Möglichkeiten hat, um eine MVC Anwendung zu testen. Aber besser wir schauen uns das Beispiel hier an.

Der folgende Test ist ein einfacher Testfall für einen UserController, bei dem folgendes geprüft wird:

  • Das Login Formular sollte nicht-authentifizierten Benutzern angezeigt werden.
  • Wenn sich ein Benutzer einloggt, sollte er zu seiner Profilseite umgeleitet werden, und diese Profilseite sollte relevante Informationen enthalten.

Dieses spezielle Beispiel besitzt aber eine interessante Setup-Methode: Man leitet das komplette Bootstrapping in ein Plugin. Das vereinfacht das Setup des Testfalles und erlaubt uns, unsere Umgebung gezielt zu spezifizieren bzw. einzustellen. Außerdem ermöglicht es uns, die Anwendung in einer einzigen Zeile zu starten. Unser spezielles Beispiel nimmt also an, dass das Setup automatisch lädt, so dass wir uns nicht um das Laden der betreffenden Klassen kümmern müssen.

class UserControllerTest 
extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }
 
    public function appBootstrap()
    {
        $this->frontController
             ->registerPlugin(new SomeBugApp_Plugin_Initialize('development'));
    }
 
    public function testCallWithoutActionShouldPullFromIndexAction()
    {
        $this->dispatch('/user');
        $this->assertController('user');
        $this->assertAction('index');
    }
 
    public function testIndexActionShouldContainLoginForm()
    {
        $this->dispatch('/user');
        $this->assertAction('index');
        $this->assertQueryCount('form#loginForm', 1);
    }
 
    public function testValidLoginShouldGoToProfilePage()
    {
        $this->request->setMethod('POST')
              ->setPost(array(
                  'username' => 'foobar',
                  'password' => 'foobar'
              ));
        $this->dispatch('/user/login');
        $this->assertRedirectTo('/user/view');
 
        $this->resetRequest()
             ->resetResponse();
 
        $this->request->setMethod('GET')
             ->setPost(array());
        $this->dispatch('/user/view');
        $this->assertRoute('default');
        $this->assertModule('default');
        $this->assertController('user');
        $this->assertAction('view');
        $this->assertNotRedirect();
        $this->assertQuery('dl');
        $this->assertQueryContentContains('h2', 'User: foobar');
    }
}

Dies ist nur ein Bruchteil der Fähigkeiten die Zend_Test_PHPUnit einen bietet. Es werden zudem eine Vielzahl an weiteren hilfreichen Möglichkeiten geboten die das Schreiben von PHPUnit Test erheblich erleichtern und beschleunigen. Zum guten Schluss empfehle ich einen Blick in die Zend_Test_PHPUnit_Db Komponente, die mir eine Menge an Konfigurations-Arbeit abgenommen hatte. Die Dokumentation ist leider im Google-Englisch geschrieben, aber man versteht gut was gemeint ist und kann sofort die Klasse einsetzen und die Vorteile bereits nach kürzester Zeit genießen. Viel Spass beim Lesen und Tests schreiben.

Weiterführende Informationen:
Zend_Test Kommponente

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.