M@XCode

Personal blog dedicated to computer science

Comment installer PHPUnit sur macOs sur un projet PHP existant et écrire son premier cas de test

PHPUnit est un Framework puissant permettant d’automatiser des tests unitaires sur une application écrite en PHP.

Qu’est ce qu’un test unitaire

Usuellement il s’agit d’un morceau de code source permettant de tester si une fonction (ou une méthode d’une classe en POO) a le fonctionnement attendu.

Ainsi dans l’idéal, chaque fonction de notre application doit avoir un test associé. Le rapport entre le nombre de fonctions étant testés effectivement par un test unitaire ET le nombre de fonctions non testés donne une indication de la couverture du code (code coverage)

Chaque test unitaire doit être en général indépendant car associé à une seule et même fonction. Il se peut par contre que l’exécution de la suite de tests nécessite l’exécution d’un script de démarrage.

Par exemple si vous voulez tester que la fonction f renvoi bien le nombre de point qu’un de vos utilisateurs a récolté, il faudra bien qu’un script exécuté avant toute chose crée cette utilisateur et lui associé un nombre de points, afin de vérifier si le résultat est bien celui attendu.

Ecrire des tests unitaires permet d’avoir un code modulaire et évolutif qui sépare correctement l’interface de l’implémentation. Le module qui est suffisamment testé peut être réutilisé dans un développement ultérieur.

Avantages des tests unitaires

Avoir une application avec des tests unitaires permet de livrer en production des versions de votre application fonctionnelle en toute confiance. Par exemple, votre équipe a développé une grosse brique fonctionnelle susceptible d’impacter d’autres fonctionnalités du site. Livrer sur l’environnement de production une telle modification peut être catastrophique. Le passage en revue de tous les tests permettra de s’assurer que cette nouvelle fonctionnalité fonctionne de manière attendu sans détériorer l’existant (on appelle ce cas une régression fonctionnelle).

Rédiger des tests pour chaque fonction nécessite un temps additionnel pour le développeur mais en rédigeant des tests de qualité, cela améliorera intrinsèquement la documentation du code. Un nouvel arrivant pourra se référer aux tests pour comprendre le fonctionnement de telle fonction.

Installation de PHPUnit sur macOs

  1. Ouvrez votre terminal

  2. Dans ce dernier tapez 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

NB : Ne pas recopier le symbole dollar ($), il s’agit ici d’une convention d’écriture dans le terminal.

Ces 3 commandes permettent de télécharger phpunit.phar. The chmodcommand va modifier les droits d’accès du fichier phpunit.phar. Plus précisément cela va donner le droit de lecture et d’exécution du fichier à tous les utilisateurs, les groupes et les autres parties du système.

La commande mvpermet quand à elle de changer de place ce fichier, de l’emplacement actuel à l’emplacement /usr/local/bin/phpunit

  1. Afin de vérifier si l’installation s’est bien déroulée veillez à exécuter cette commande :
1
$ phpunit -version

Si l’installation est OK vous devriez voir s’afficher dans votre terminal la ligne suivante :

1
PHPUnit 5.5.0 by Sebastian Bergmann and contributors.

(La version peut changer)

Configuration d’un projet existant et rédaction du premier test

  1. Sur un projet existant la première étape va consister à créer un dossier nommé tests à la racine de votre dossier.

Dans ce dernier vous allez placer tous vos tests. La règle étant que pour chaque classe de votre projet (si vous utilisez la POO) un fichier devra être créé.

La convention de nommage que j’utilise personnellement est la suivante :

1
NomDeVotreClasseTests.php

ou en camel case :

1
nom_de_la_classe_tests.php

  1. Ainsi si vous avez une classe Utilisateur définie au sein du fichier Utilisateur.php vous trouverez en miroir un fichier de test de cette classe nommé UtilisateurTests.php

Ce fichier aura toujours une composition identique :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//fichier : tests/UtilisateurTests.php
<?php
// Réglage de la time zone
date_default_timezone_set('America/Los_Angeles');
// Si vous utilisez composer (le gestionnaire de package, ajoutez cette ligne)
require_once __DIR__ .'/../vendor/autoload.php';

class UtilisateurTests extends TestCase
{

// il s'agit ici de la structure d'un test unitaire pour la méthode
// function_number_one de notre Utilisateur
public function test_function_number_one(){


}



}

Nous avons donc ici la classe permettant de tester la classe Utilisateur.
Cette classe se nomme UtilisateurTests et il s’agit d’une extension de la classe TestCase. Cette dernière est une classe interne à PHPUnit et elle nous permet d’utiliser des méthodes faciles pour écrire nos tests.

Ici un seul test unitaire est définit. En fait un test unitaire est une méthode de la classe de test (UtilisateurTests). Chaque test va donc tester une méthode de notre classe Utilisateur.

  1. L’étape suivante consiste à écrire effectivement notre test.
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
<?php
// fichier : tests/UtilisateurTests.php
// Réglage de la timezone
date_default_timezone_set('America/Los_Angeles');
// Si vous utilisez composer (le gestionnaire de package, ajoutez cette ligne)
require_once __DIR__ .'/../vendor/autoload.php';

class UtilisateurTests extends TestCase
{

// il s'agit ici de la structure d'un test unitaire pour la méthode
// function_number_one de notre Utilisateur
public function test_function_number_one(){

// instanciation de notre classe Utilisateur
$instance_utilisateur = new Utilisateur();
// execution de la méthode à tester
$resultat_function_number_one = $instance_utilisateur -> function_number_one(123);
// TEST du résultat attendu
$this->assertEquals("resultat attendu", $resultat_function_number_one);


}



}

Le cas de test consiste simplement à lancer la méthode function_number_one avec le paramètre 123.
Nous allons ensuite tester si le résultat d’exécution de cette méthode est bien égale au résultat attendu grâce à la ligne $this->assertEquals("resultat attendu", $resultat_function_number_one);

  1. Exécuter le test

Afin de lancer votre test il suffit d’ouvrir votre terminal et de taper :

1
2
$ cd le_dossier_contenant_votre_application
$ phpunit tests

La commande numéro 2 va dire à PHPUnit de lancer l’exécution des tests définit dans le dossier tests

Et voilà ! Bon tests