Recherche

Calendrier

Février 2010
L M M J V S D
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
             
<< < > >>

Illustrations

  • test-1.jpg
  • Eleanore O'Ryan

Catégories

Présentation

Recommander

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 !
Par Torgan - Publié dans : Overblog
Ecrire un commentaire - Voir les 1 commentaires
Retour à l'accueil
 
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus