Unittests
Da das Yii-Testframework auf PHPUnit basiert, empfehlen wir Ihnen, sich zunächst die Dokumenation von PHPUnit durchzulesen, um die Grundsätze beim Schreiben eines Tests zu verstehen. Zusammengefasst gelten diese Grundprinzipien für das Schreiben von Unittests in Yii:
Ein Unittest wird als Klasse
XyzTestgeschrieben, die CTestCase oder CDbTestCase erweitert, wobeiXyzfür die zu testende Klasse steht. Um z.B. die KlassePostzu testen, würden wir den Unittest per KonventionPostTestnennen. Die Basisklasse CTestCase dient für allgemeine Unittests, während CDbTestCase zum Testen von ActiveRecord-Modelklassen geeignet ist. Da beide vonPHPUnit_Framework_TestCaseabgeleitet sind, können wir alle von dieser Klasse geerbten Methoden verwenden.Die Unittestklasse wird per Konvention in einer PHP-Datei mit den Namen
XyzTest.phpim Verzeichnisprotected/tests/unitabgelegt.Die Testklasse besteht im Wesentlichen aus Methoden die
testAbcheißen, wobeiAbcoft für den Namen der zu testenden Klassenmethode steht.Eine Testmethode enthält für gewöhnlich eine Reihe von Assert-Statements (sinngem.: feststellen, versichern), z.B.
assertTrueoderassertEquals, die als Checkpunkte beim Prüfen der Zielklasse dienen.
Im folgenden beschreiben wir hauptsächlich, wie man Unittests für ActiveRecord-Modelklassen schreibt. Wir leiten unsere Testklassen von CDbTestCase ab, da sie die im letzten Abschnitt vorgestellten Fixtures unterstützt.
Nehmen wir an, wir wollen die Modelklasse Comment aus dem
Blog-Demo testen. Wir erstellen
also zunächst eine Klasse CommentTest und speichern diese unter
protected/tests/unit/CommentTest.php:
In dieser Klasse geben wir in der Variable fixtures die zu verwendenden
Fixtures als Array an. Das Array stellt eine Zuordnung von Fixturenamen auf
Modelklassen- oder Tabellennamen dar (z.B. von Fixturename post zur
Modelklasse Post). Beachten Sie, dass Tabellennamen ein Doppelpunkt
vorangestellt werden muss, um sie vom Namen der Modelklasse unterscheiden zu
können (z.B. :Post). Wenn wir Modelklassennamen verwenden werden die
entsprechenden Tabellen als Fixturetabellen interpretiert. Wie bereits
erwähnt, werden Fixturetabellen jedesmal, wenn eine Testmethode ausgeführt
wird, auf einen fest definierten Zustand zurückgesetzt.
Fixturenamen erlauben den bequemen Zugriff auf Fixturedaten innerhalb von Testmethoden. Hier ein typisches Anwendungsbeispiel:
Hinweis: Wenn ein Fixture über seinen Tabellennamen festgelegt wurde (z.B.
'posts'=>':Post'), kann die dritte Variante in obigem Beispiel nicht verwendet werden, da wir keine Information darüber haben, mit welcher Modelklasse die Tabelle verbunden ist.
Als nächstes schreiben wir die Methode testApprove um die approve-Methode
in der Modelklasse Comment zu testen. Der Code ist sehr unkompliziert:
Zunächst fügen wir einen Kommentar mit dem Status pending ein. Dann
verifizieren wir, dass der Kommentar im Status pending ist, indem wir ihn aus
der Datenbank zurücklesen. Schließlich rufen wir die Methode approve auf und
prüfen, ob sich der Status wie erwartet verändert hat.