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.