Ich beschäftige mich derzeit intensiv mit ATDD bzw BDD (den Unterschied zwischen beiden verstehe ich noch nicht) und habe deswegen Fitnesse ausprobiert. Die Wahl der Sprache fiel auf Php wegen der größten Schnittmenge bei allen Projektteilnehmern. Aus dem Grund habe ich den PhpSlim-Runner angetestet.
Problem 1: Debuggen extrem schwer
Laufzeit-Fehler in den “Fixtures”, die Übersetzungscode von BDD-Sprache zu ausführbarem Code, werden schlecht oder gar nicht angezeigt. Im krassesten Fall, wenn man auf ein “undef” eine Methode ausführt, bekommt man überhaupt keine Ausgabe mehr und eine Errorlog gibt es nicht.
Lösung
In dem Runner bei der Ausführung des Codes die error- und exception handler korrekt setzen. Die Umsetzung in PhpSlim ist unten erläutert.
Problem 2: wenn Fehlertexte, dann sind sie unübersichtlich
Wenn man einen regulären Fehler melden will, bekommt man in Fitnesse eine zugeklappte “Exception” gesammelt in einer Liste incl. Stacktrace, der komplett uninteressant ist.
Lösung
Wenn eine Exception mit dem Text message:<< NACHRICHT >> wirft, wird dieser direkt beim fehlgeschlagenen Test angezeigt. Zwei Besonderheiten gibt es:
- Leerzeichen zwischen < der Nachricht und > sind zwingend erforderlich, da sonst gar nichts angezeigt wird.
- Es dürfen keinerlei Zeilenumbrüche in der Meldung sein, ansonsten wird wieder so eine Sammel-Nachricht daraus.
Die Umsetzung in PhpSlim ist unten erläutert.
Problem 3: Tests werden rot, röter, am rötesten
Schlägt ein Punkt in einem Test fehl, wird trotzdem der restliche Test ausgeführt. Wenn man Unittests in z.B. Java gewohnt ist, fühlt sich das irgendwie falsch an. Außerdem: der Test ist rot. Röter kann er nicht werden. Er kostet also nur Zeit ohne Zusatznutzen.
Lösung
Wenn man eine Exception wirft, die ein “StopTest” im Namen trägt, bricht der Test direkt ab.
Eine Besonderheit gibt es dabei: es wird kein TearDown für diesen Test ausgeführt. Das sollte man beachten.
Umsetzung aller Lösungen
Dafür muss man den PhpSlim-Runner, also die Phar-Datei, etwas anpassen. Wie das geht, steht hier.
Es muss nur die Datei PhpSlim/StatementExecutor.php bearbeitet werden.
Ganz oben folgende Klasse, oberhalb der bestehenden Klasse, einfügen:
class PhpSlim_StatementExecutor_StopTestException extends Exception {
public function __construct($errormsg, $errno, $errfile, $errline) {
return parent::__construct("message:<< $errormsg [line: $errline] >>");
}
}
Dann noch diesen Code:
set_error_handler(array($this, 'exceptionErrorHandler'));
$result = $method->invokeArgs($callback[0], $args);
restore_error_handler();
durch diesen ersetzen:
set_error_handler(array($this, 'exceptionErrorHandler'));
set_exception_handler(array($this, 'exceptionErrorHandler'));
$result = $method->invokeArgs($callback[0], $args);
restore_error_handler();
restore_exception_handler();
Und letztendlich noch diesen Code:
public function exceptionErrorHandler($errno, $errstr, $errfile, $errline) {
if ($errno & error_reporting()) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
}
durch diesen ersetzen:
public function exceptionErrorHandler($errno, $errstr, $errfile, $errline) {
if ($errno & error_reporting()) {
throw new PhpSlim_StatementExecutor_StopTestException($errstr, $errno, $errfile, $errline);
}
}
Fertig. Danach ist das Debuggen super simpel und alles bleibt einfach und Übersichtlich (und *BlingBling*, *awesome* und *supersexy*)
So sieht es im übrigen dann aus:
[FEHLT]