M@XCode

Personal blog dedicated to computer science

Comment installer PHPUnit sur un projet nécessitant composer et utilisant des variables d'environnement

Installation de PHPUnit (macOS)

Afin d’installer PHPUnit nous allons devoir ouvrir le terminal et taper les commandes suivantes :

1
2
3
$ curl https://phar.phpunit.de/phpunit.phar -L -o phpunit.phar
$ chmod +x phpunit.phar
$ mv phpunit.phar /usr/local/bin/phpunit

Ces commandes permettent de télécharger le fichier .phar. (Un fichier .PHAR est une PHP Archive, une application PHP compactée dans un seul et même fichier). Elles permettent ensuite d’étendre le niveau des droits sur ce dernier fichier (lecture, écriture, exécution). Nous déplaçons ensuite phpunit.phar dans le dossier /usr/local/bin/phpunit afin que nous puissions l’exécuter directement depuis notre terminal via la commande phpunit.

Création du fichier phpunit.xml contenant l’ensemble des variables d’environnement

Si vos scripts PHP font usage de variables d’environnement. Vous vous devez de fournir une valeur à ces variables dans vos tests unitaires. En effet si vous exécutez vos tests unitaires sans ces variables définies vos test échoueront, faute de variables définies.

PHPUnit permet la configuration de ces variables de manière très simple. Il vous suffit de créer un fichier nommé phpunit.xml à la racine du dossier de votre application :

1
2
3
4
5
6
7
8
9

<phpunit bootstrap="bootstrap_file.php">
<php>
<env name="DB_HOST" value="127.0.0.1:3306"/>
<env name="DB_USER" value="root"/>
<env name="DB_PASS" value="root"/>
...
</php>
</phpunit>

Dans notre cas nous définissons ici 3 variables d’environnement nommées DB_HOST, DB_USER et DB_PASS ayant respectivement les valeurs 127.0.0.1:3306, root, root.

D’autre part dans ce fichier de configuration est aussi définit un fichier de bootstrap qui va nous permettre de créer une procédure de démarrage spécifique au test de notre application.

Création du script de bootstrap.

Notre script de bootstrap devra effectuer une tâche :

  • Charger l’ensemble des classes que nous avons développées afin que nous n’ayons pas à faire des require dans chaque fichier décrivant un test unitaire. Cette astuce permet de gagner un temps précieux !
1
2
3
4
5
6
7
8
<?php
function my_autoloader($class) {
include 'classes/' . $class . '.php';
}

spl_autoload_register('my_autoloader');

?>

Si toutes vos classes sont regroupées dans le dossier classes (sans sous-dossiers) situé à la racine de votre application vous pouvez adopter cet autoloader simple. Une autre contrainte est que le nom de vos classes doit correspondre trait pour trait au nom du fichier dans lesquels elles sont définies.

Jess Telford fournit une implémentation plus complexe permettant d’inclure les sous dossiers : http://jes.st/2011/phpunit-bootstrap-and-autoloading-classes/.

Un test unitaire

1
2
3
4
5
6
7
8
9
10
11
<?php
date_default_timezone_set('America/Los_Angeles');
// require composer classes
require_once __DIR__ .'/../vendor/autoload.php';
use PHPUnit\Framework\TestCase;

class UserTest extends TestCase
{


}

Et voilà. Vous pouvez tester des fonctions disposant de variables d'environnement et tester toutes vos classes sans avoir à penser à appeler require à chaque utilisation d’une nouvelle classe.