am 9. März 2010
Schon lange ist es her, dass ich eine Kolumne veröffentlicht habe. Aus diesem Grund möchte ich gerade Neulingen als auch fortgeschrittenen PHP-Entwicklern helfen sich mit dem Begriff Qualitätssicherung bekannt zu machen.
Informationssammlung
Als am 15. März 2004 PHPUnit von Sebastian Bergmann veröffentlicht wurde, hatte wohl keiner gedacht, dass sich dieses Framework so schnell etablieren würde. xUnit Test Varianten waren zwar auch damals schon bekannt, allerdings noch nicht verbreitet. Im Grunde kam die Idee für die testorientierte Entwicklung aus dem Bereich Java und wurde von Erich Gamma und Kent Beck in die Wege geleitet. Neben Propel nutzt auch Serendipity oder das Zend Framework die PHPUnit Komponente zur Qualitätssicherung.
Der Sinn
Wie auch in anderen Programmiersprachen haben Entwickler auch in PHP mit der Qualität zu kämpfen. Man kennt es: Der Kunde möchte diese Erweiterung, jene Erweiterung und dann am besten noch eine – allerdings vergisst man dabei schnell das eigentliche Ziel des Produktes: Fehlerfreiheit. Kein Software-Entwickler schafft es seine Produktion makellos zu konstruieren. Die Frage dabei lautet aber nicht, wie ich meine Fehler ausbessere, sondern wie ich sie verhindere. Der genannte Schritt passiert nicht während der Entwicklung und auch nicht danach – sondern davor. Zunächst muss die Applikation genau geplant werden, um zu definieren welche Methoden und Klassen benötigt werden, sodass das Ganze am besten via UML erfasst werden kann. Als Devise gilt: Do not build classes or methods without a unit test.
Installation
PHPUnit bietet mehrere Möglichkeiten zur Installation und kann auf jedem System installiert werden, welches einer höheren Version als PHP 4.3.0 entspricht. Im manual des von Sebastian Bergmann entwickelten Frameworks findet man auch Schritte, die einen durch die Installation leiten.
Unser erster Test
Das Test-Framework erlaubt es dem Nutzer über diverse Methoden seine Produktionen zu prüfen. Meist beginnen diese mit assert. In unserem Fall verwenden wir neben assertSame auch assertArrayHasKey und assertObjectHasAttribute.
- assertSame (assertSame(mixed $expected, mixed $actual[, string $message = ''])) prüft ob die übergebenen Variablen dem selben Typ, sowie Wert entsprechen.
- assertArrayHasKey (assertArrayHasKey(mixed $key, array $array[, string $message = ''])) sieht nach, ob in dem übergebenen Array der zuvor deklarierte Schlüssel existiert.
- assertObjectHasAttribute (assertObjectHasAttribute(string $attributeName, object $object[, string $message = ''])) macht im Grunde dasselbe wie assertArrayHasKey. Der Unterschied der beiden Methoden liegt darin, dass assertObjectHasAttribute Klassen prüft.
class PHPHatesMeTest extends PHPUnit_Framework_TestCase
{
public function testAuthor()
{
$author = 'Marc Binder';
$this->assertSame($author, 'Marc Binder');
}
public function testArrayKey()
{
$data = array(
'nickname' => 'MrBoolean',
'forename' => 'Marc',
'surname' => 'Binder'
);
$this->assertArrayHasKey('nickname', $data);
$this->assertArrayHasKey('forename', $data);
$this->assertArrayHasKey('surname', $data);
}
public function testObjectAttribute()
{
$object = new stdClass();
$object->nickname = 'MrBoolean';
$object->forename = 'Marc';
$object->surname = 'Binder';
$this->assertObjectHasAttribute('nickname', $object);
$this->assertObjectHasAttribute('forename', $object);
$this->assertObjectHasAttribute('surname', $object);
}
}
Der Test kann nun ausgeführt werden. Folgendes Resultat wird zurückgeliefert:
PHPUnit 3.4.9 by Sebastian Bergmann.
...
Time: 1 second, Memory: 4.25Mb
OK (3 tests, 7 assertions)
Abschluss & Weiterführendes
Natürlich sind die oben genannten Methoden noch lange nicht alles was PHPUnit zu bieten hat. Jedoch ist es ein kleiner Einblick in die testgetriebene Entwicklung.
Alles rund um die Assert-Api des PHPUnit Frameworks
Annotations in PHPUnit
Mock-Objects
Natülich ist PHPUnit mit einem Artikel nicht erklärt. Genau deswegen wird dieser Artikel mehrere Teile erhalten, die tiefer in die Komponenten von PHPUnit eingehen.