von Mario Rimann, 03.06.2008

Eine Einführung in Unit Testing mit PHP: Makelloser Code durch effizientes Testen

Aus dem
t3n Magazin Nr. 12

Jetzt kaufen

Zudem sollte jeder Test unter gleichbleibenden, reproduzierbaren Rahmenbedingungen ablaufen. In PHPUnit gibt es zu diesem Zweck die so genannten Fixtures, die für jeden Test eine feste Testumgebung aufbauen. Die Fixtures werden durch die beiden Funktionen setUp() und tearDown() kontrolliert, die vor beziehungsweise nach jedem einzelnen Test durchlaufen werden. In diesen Funktionen wird das eigentliche Fixture je nach Bedarf initialisiert und wieder gelöscht. Zusätzlich wird jeder einzelne Test innerhalb einer neuen Instanz der Test-Runner-Klasse von PHPUnit ausgeführt.

Zu testende Klasse (stark vereinfacht)

class Article() {
	private $title;
	public function __construct($uid) {
		// Objekt wird abhängig von der übergebenen UID instantiiert
	}
	public function getTitle() {
		return $this->title;
	}
}

Listing 3

Die oben skizzierte Klasse repräsentiert einen Artikel, der beispielsweise in einem Onlineshop vorkommen kann. Auf die private Variable $title kann ausschließlich über die öffentliche Funktion getTitle() zugegriffen werden. Die folgende Testsuite ist eine eigene Klasse, die sich von der Klasse TestCase aus PHPUnit ableitet. Dadurch stehen automatisch sämtliche Hilfsfunktionen von PHPUnit zur Verfügung.

Testsuite für die Klasse „Article“

public function setUp() {
	$this->uid = createDummyArticleInDatabase(
		array('title' => 'Test Title')
	);
	$this->fixture = new Article($this->uid);
}
public function tearDown() {
	unset($this->fixture);
	$this->removeDummyArticleFromDatabase($this->uid);
}
public function testGetTitle() {
	$this->assertEquals(
		'Test Title',
		$this->fixture->getTitle()
	);
}

Listing 4

In diesem Beispiel wird in der Funktion setUp() bei jedem Testdurchlauf ein Dummy-Datensatz in die Datenbank geschrieben. Damit sich in der Datenbank keine Datenleichen ansammeln, wird der erzeugte Dummy in der Funktion tearDown() wieder gelöscht.

In der Funktion testGetTitle() wird der eigentliche Test durchgeführt. In der Variable $this->fixture ist jetzt ein sauber instantiiertes Article-Objekt abgelegt, auf das ohne Umwege zugegriffen werden kann. Der große Vorteil der Fixtures wird allerdings erst ersichtlich, wenn die Testsuite eine Vielzahl von Tests beinhaltet. Es ist dann jedes Mal sichergestellt, dass einzelne Testläufe in der Variable $this->fixture auf ein frisch instantiiertes Objekt zugreifen und somit in einer klar definierten Umgebung testen.

Seite:  1 2 3 4 5