Wir empfehlen Ihnen, sich zunächst die Selenium Dokumenation sowie die PHPUnit Dokumenation durchzulesen. Zusammengefasst gelten diese Grundprinzipien für das Schreiben von Funktionstests in Yii:
Genauso wie bei Unittests wird ein Funktionstest als Klasse XyzTest
geschrieben, die diesmal von CWebTestCase abgeleitet wird, wobei Xyz
für
die zu testende Klasse steht. Da CWebTestCase die Klasse
PHPUnit_Extensions_SeleniumTestCase
erweitert, können wir alle von dieser
Klasse geerbten Methoden verwenden.
Die Funktionstestklasse wird per Konvention in einer PHP-Date namens XyzTest.php
im Verzeichnis protected/tests/functional
gespeichert.
Die Testklasse besteht im Wesentlichen aus einer Reihe von Methoden namens
testAbc
, wobei Abc
oft für den Namen eines zu testenden Features steht. Um
zum Beispiel das User-Login-Feature zu testen, könnte wir eine Testmethode
testLogin
anlegen.
Eine Testmethode enthält für gewöhnlich eine Reihe von Anweisungen, die Befehle an Selenium RC senden, um mit der zu testenden Webanwendung zu interagieren. Sie enthält auch Assert-Statements um zu prüfen, dass die Anwendung wie erwartet reagiert.
Bevor wir näher darauf eingehen, wie man einen Funktionstest schreibt, sehen
wir uns zunächst die Datei WebTestCase.php
näher an, die von yiic webapp
erstellt wurde. In dieser Datei wird WebTestCase
definiert, die man als
Basisklasse für alle Funktionstest verwenden kann.
define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/');
class WebTestCase extends CWebTestCase
{
/**
* Wird vor jeder Testmethode ausgeführt.
* Setzt die Basis-URL für die Testanwendung.
*/
protected function setUp()
{
parent::setUp();
$this->setBrowserUrl(TEST_BASE_URL);
}
......
}
Die Klasse WebTestCase
setzt die Basis-URL der zu testenden Seiten.
Später können wir daher in Testmethoden relative URLs für diese Seiten
verwenden.
Wir sollten auch beachten, dass wir für die Basis-URL unserer Tests
index-test.php
statt index.php
verwenden. Der einzige Unterschied zwischen
den beiden Dateien besteht darin, dass erstere test.php
als
Konfigurationsdatei verwendet, letztere main.php
.
Sehen wir uns nun an, wie wir das Feature zur Anzeige eines Beitrags im Blog-Demo testen können. Zunächst schreiben wir die Testklasse wie folgt (Beachten Sie, dass wir sie von WebTestCase ableiten):
class PostTest extends WebTestCase
{
public $fixtures=array(
'posts'=>'Post',
);
public function testShow()
{
$this->open('post/1');
// Prüfe, ob der Beispielbeitrag existiert
$this->assertTextPresent($this->posts['sample1']['title']);
// Prüfe, ob das Kommentarformular vorhanden ist
$this->assertTextPresent('Leave a Comment');
}
......
}
Genau wie bei einem Unittest geben wir die für den Test zu verwendenden Fixtures an.
In diesem Fall soll das Fixture für Post
verwendet werden. In der Methode
testShow
weisen wir Selenium RC zuerst and, die URL post/1
zu öffnen. Man
beachte, dass es sich hier um eine relative URL handelt. Die vollständige
URL wird mit der in der Basisklasse gesetzten Basis-URL gebildet (z.B.
http://localhost/yii/demos/blog/index-test.php/post/1
). Wir prüfen dann, ob
der Titel des Beitrags sample1
in der aktuellen Seite gefunden wurde. Und
wir stellen auch sicher, dass die Seite den Text Leave a Comment
enthält.
Tipp: Um einen Funktionstest durchzuführen muss zunächst der Selenium-RC-Server gestartet werden. Dazu wird in dessen Installationsverzeichnis folgender Befehl ausgeführt:
java -jar selenium-server.jar
.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.