Home-Produkte-Testarea-Kontakt-Datenschutz-Aktualisiert: 20-Aug-2012
< Voriger Tag   Nächster Tag >

Montag, 20. August 2012

PHP: Framework - Web-Tests mit SimpleTest

Für die Web-Tests benutzt das users_field-Beispiel SimpleTest - zusätzlich wird der HTML5-Code validiert.

SimpleTest

SimpleTest bietet direkte Unterstützung für HTML-Web-Tests, ohne dass zusätzliche Tools benötigt werden. Das Schreiben der Tests ähnelt stark der Benutzung eines Webbrowsers mit Maus und Tastatur für die Eingaben: users_show_test.php

public function testListUsers() {
    $this->get($this->cfg->baseURL);
    $this->click('users');

    $this->assertTitle('Users');
    $this->assertText('John [Edit]');
    $this->assertText('<script>alert("name")</script>');
    $this->assertPattern('#<a href="1.html">John</a>#');

    // HTML escaped?
    $this->assertPattern('#&lt;script&gt;alert(&quot;name&quot;)&lt;/script&gt;#');
    $this->assertNoPattern('#<script>alert("name")</script>#');

    $this->assertEqual(2, $this->requestCount, 'Missing requests %s');
}// testListUsers

JavaScript wird vom SimpleTest::WebTestCase V1.1.0 nicht ausgeführt.

HTML5-Validierung

Das Framework benutzt mit Rubisco\Test\SimpleTest\WebTestCase und -Browser eigene Unterklassen von SimpleTest::WebTestCase und SimpleTest::Browser, die um einen After-Request-Callback erweitert sind. In diesem wird nach jedem HTTP-Request der HTML5-Code überprüft:

public function afterRequest() {
    $this->requestCount++;

    $this->assertMime('text/html');

    $this->htmlValidator->content = $this->getBrowser()->getContent();
    $result = $this->htmlValidator->validate();
    $this->assertTrue($result->isValid('noMessages'), "HTML5 sourcecode not valid");
    $this->showSource(); // TODO Delete, toggle?
}// afterRequest

Zur HTML5-Validierung wird der lokal installierte Validator.nu benutzt. Sein Aufruf erfolgt mit Hilfe der Klasse Rubisco\Service\ValidatorNu, die noch sehr provisorisch ist.

Testmodus mit X-Rubisco-Environment-Header

Das Environment kann nun auch per HTTP-Header gesetzt werden. Zur Absicherung muss zusätzlich ein gültiger Key übertragen werden, der in configs/rubisco_keys steht.

Bei den Web-Tests wird damit bei jedem HTTP-Request ein X-Rubisco-Environment: test inklusive Key mitgeschickt:

public function setUp() {
    $this->requestCount = 0;
    $this->setAfterRequestCallback([$this, 'afterRequest']);
    $this->addHeader('X-Rubisco-Environment: test');

    $keyFilename = __DIR__ . '/../../configs/rubisco_keys';
    if(file_exists($keyFilename)) {
        $this->addHeader('X-Rubisco-Key: ' . file_get_contents($keyFilename));
    }
}// setUp

server-start-stop.sh

Das Shell-Script bin/server-start-stop.sh dient zum Starten und Beenden des In-Built-Servers von PHP 5.4+. Dieser wird bei jedem Web-Test passend zum Projekt gestartet und beendet: build.xml

<target name="test"
    description="Run all tests">
    <exec command="${serverstartstopbin} start" checkreturn="true" outputProperty="exec.output" />
    <echo msg="${exec.output}"/>
    <simpletest haltonerror="true" haltonfailure="true">
        <formatter type="plain" usefile="false" />
        <fileset dir="${test.dir}">
            <include name="**/*_test.php"/>
        </fileset>
    </simpletest>
    <exec command="${serverstartstopbin} stop" checkreturn="true" outputProperty="exec.output" />
    <echo msg="${exec.output}"/>
</target>

Wenn dann noch zusätzlich SQLite für die Datenbank verwendet wird, können die Tests problemlos allein mit PHP laufen, ohne dass für sie ein Web- und Datenbankserver konfiguriert werden muss.

rubisco-Tool

Und das rubisco-Tool unterstützt nun die -E-Option zum Setzen des Environments. Somit kann damit nun auch eine Testdatenbank angelegt werden: rubisco -E test dbmigrate up.

Ziemlich viel nur fürs Hinzufügen von Web-Tests aber das Ganze funktioniert gut und die Tests lassen sich intuitiv schreiben.

[Direktlink]

< Voriger Tag   Nächster Tag >

  RSS V0.91

<August 2012 >
  0102030405
06070809101112
13141516171819
20212223242526
2728293031  

Home-Produkte-Testarea-Kontakt-Datenschutz-Aktualisiert: 20-Aug-2012
(C) 2000-2018 by Sven Drieling