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('#<script>alert("name")</script>#');
$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.
