Florian Herlings, freier Webentwickler aus Düsseldorf.

Symfony-Tests in einer Endlosschleife ausführen

Gerade wenn man testgetrieben entwickelt (TDD) ist es praktisch, seine Test-Suite möglichst oft laufen zu lassen. Symfony bietet einem über das Kommandozeilen-Tool die Möglichkeit, seine Tests mit einem einfachen Befehl symfony test:all auszuführen.

Aber nach jeder Änderung immer wieder das Kommandozeilen-Fenster auszuwählen, und die Tests von Hand anzuschmeißen ist beizeiten etwas umständlich.

Ein „Continuous Integration“-Server ist sicherlich die optimale Lösung, aber wer es etwas kleiner mag, kann die Tests auch direkt in Symfony in einer Endlosschleife laufen lassen. Sicherlich ließe sich dies noch deutlich schicker und sauberer schreiben, aber wer eine schnelle Lösung braucht, kann diesen Task sicherlich verwenden.

"test:loop"-Task anlegen

Zunächst legt man einen neuen Task an:

symfony generate:task testLoop

Dann öffnet man die neu angelegte Task-Datei ./lib/task/testLoopTask.class.php und trägt folgenden Code dort ein:

 class testLoopTask extends sfBaseTask
 { 
   protected function configure() 
   { 
     $this->namespace        = 'test';
     $this->name             = 'loop';
     $this->briefDescription = 'Runs test:all in a loop.';
     $this->detailedDescription = <<<EOF
 The test:loop task runs all tests (test:all) in a loop with 5 seconds delay between each run.
 Call it with:
 
   [php symfony test:loop|INFO]
 
 Kill it by pressing CMD+C.
 EOF;
   } 
 
   protected function execute($arguments = array(), $options = array()) 
   { 
     while(true)
     {      
       echo PHP_EOL.'Running all tests.'.PHP_EOL;
       system('php symfony test:all -t');
       echo "Waiting..";
       for($i=5; $i > 0; $i--) { echo ', '.$i; sleep(1); } 
     }
   } 
}

Den Task ausführen

Die Endlosschleife lässt sich nun leicht über das Symfony-Kommandozeilen-Tool ausführen und mit der Tasten-Kombination Strg+C abbrechen.

symfony test:loop