Vendredi 14 août 2009
5
14
/08
/2009
13:48

Tout le monde le sait (ou presque du moins) : overblog est basé sur le framework PHP
Jelix (version 1.1.2 pour les curieux). Notre version est très légèrement modifiée pour des besoins qui nous sont propres, mais de façon le plus limité
possible. Les modifications applicables au projet Jelix sont généralement fournies à Laurent Jouanneau pour intégration.
Petit reproche à Jelix, malgré tout le bien que je pense de ce framework, le moteur de tests unitaires
simpletest utilisé ne me plaisait pas plus que
ça.
PhpUnit nous a semblé plus complet, en particulier grace à la possibilité de générer des rapports de couverture de code, particulièrement précieux
pour repérer les parties de code non testées.
Toujours-est il que de faire cohabiter l'environnement Jelix et l'environnement PHPUnit semblait bien compliqué jusqu'à la découverte d'une feinte. Bon tout d'abord on installe PHPunit en suivant
la procédure normale d'installation (c'est du PEAR me semble-t-il). L'exécutable
/usr/bin/phpunit est en fait un fichier php (je vous fais grâce des commentaires) :
<?php
/* PHPUnit
*
* ...
*/
if (strpos('/usr/bin/php', '@php_bin') === 0) {
set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path());
}
require_once 'PHPUnit/Util/Filter.php';
PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
require 'PHPUnit/TextUI/Command.php';
define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
PHPUnit_TextUI_Command::main();
?>
On constate que PhpUnit ne fait qu'exécuter une méthode statique PHP. Donc, si l'on parvient à exécuter cette même méthode (qui ne fait que produire du texte) dans un environnement Jelix, ça
devrait rouler tout seul.
Il suffit donc au final de créer un nouveau type de
request Jelix, et de créer un nouveau script phpunit pour remplacer le phpunit classique.
jPhpunitRequest.class.php
On rajoute cette classe dans le répertoire
request/ du core de Jelix. C'est le seul ajout qui sera fait au framework. C'est dans cette request, lors de l'initialisation des paramètres, qu'on
exécute tout simplement la méthode de Phpunit.
<?php
/**
* @package jelix
* @subpackage core_request
* @author Yannick Le Guédart
* @link http://www.jelix.org
* @licence GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
*/
require_once (JELIX_LIB_CORE_PATH.'request/jCmdLineRequest.class.php');
require_once ('PHPUnit/Framework/TestCase.php');
class jPhpunitRequest extends jCmdLineRequest
{
public $type = 'phpunit';
public $defaultResponseType = 'text';
protected function _initParams ()
{
require 'PHPUnit/TextUI/Command.php';
define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
PHPUnit_TextUI_Command::main();
}
}
Un nouveau phpunit
<?php
/**
* @package jelix
* @subpackage core_request
* @author Yannick Le Guédart
* @link http://www.jelix.org
* @licence GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
*/
require_once (JELIX_LIB_CORE_PATH.'request/jCmdLineRequest.class.php');
require_once ('PHPUnit/Framework/TestCase.php');
class jPhpunitRequest extends jCmdLineRequest
{
public $type = 'phpunit';
public $defaultResponseType = 'text';
protected function _initParams ()
{
require 'PHPUnit/TextUI/Command.php';
define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
PHPUnit_TextUI_Command::main();
}
}
Ensuite, dans le répertoire
scripts/ de notre application, on crée un nouveau exécutable
phpunit qui sera exécuté à la place de l'original pour les tests unitaires en
environnement Jelix :
<?php
/* PHPUnit
*
* ...
*/
ini_set('memory_limit', '512M');
require_once 'PHPUnit/Util/Filter.php';
PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
require_once ('/usr/local/share/jelix/lib/jelix/init.php');
require_once ('../application.init.php');
require_once (JELIX_LIB_CORE_PATH.'request/jPhpunitRequest.class.php');
$config_file = 'defaultconfig.ini.php';
$jelix = new jCoordinator ($config_file);
$jelix->process (new jPhpunitRequest());
?>
Et c'est tout ! Ca fonctionne parfaitement :
# ../scripts/phpunit _articleTest modules/data_access/classes/_articleTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
............................................................ 60 / 85
.........................
Time: 16 seconds
OK (85 tests, 643 assertions)
Bon je reste persuadé qu'on peut faire les choses beaucoup plus proprement et moins à l'arrache, mais cette solution permet d'être rapidement opérationnel sur des tests unitaires, et c'était
l'effet recherché lors de la mise en place. Les options de
phpunit sont naturellement passées à l'objet
jPhpunitRequest, et du coup toutes les options de phpunit restent
disponibles.
Have fun !