Funktionstests

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.

$Id: test.functional.txt 1662 2010-01-04 19:15:10Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.