Le code coverage avec PHPUnit

Il y a 9 mois


A l'heure du TDD (test driven developpement), BDD (Bug Driven Developpement), les tests sont partout ou presque. C'est déjà bien d'écrire des tests unitaires mais pouvoir mesurer la quantité de code couvert par nos tests c'est encore mieux cool. Le code coverage permet d'avoir des indicateurs concernants la couverture de code "passer" par nos tests unitaires. Ces indicateurs peuvent être récupérés sous plusieurs formes que l'on détaillera plus bas.

Pour commencer nous allons devoir instancier un projet vide. Voici la structure que nous allons utiliser :

Structure de dossier

Ensuite il nous faut bien évidement PHPunit que vous pouvez installer via composer avec la commande ci dessous: 

$ composer require "phpunit/phpunit=5.5.*"

Si vous n'avez pas composer allez voir ici pour son installation.

Nous avons donc le dossier vendor/ qui se crée ainsi que le fichier composer.json et composer.lock. Nous allons pas nous attarder sur leur utilisations.

On ajoute une petite modification dans le composer.json pour définir le namespace en fonction du dossier de nos classes:

{
    "require": {
        "phpunit/phpunit": "5.5.*"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

 

Considérons la classe Math ci-dessous (src/Math.php) :

namespace App;

class Math
{
    public static function double($number, $test = false)
    {
        if ($test) {
            return 'je suis un code secret';
        }

        return $number * 2;
    }

    public static function triple($number)
    {
        return $number * 3;
    }
}

 

Maintenant nous allons écrire les tests de cette classe, en omettant volontairement la condition avec le test de la variable $test. 

class MathTest extends \PHPUnit\Framework\TestCase
{
  public function testDoubleOk()
  {
    $this->assertEquals(10, \App\Math::double(5));
    $this->assertEquals(4, \App\Math::double(2));
    $this->assertEquals(6, \App\Math::double(3));
  }

  public function testTripleOk()
  {
    $this->assertNotEquals(15, \App\Math::triple(5));
  }
}


Ensuite nous allons lancer notre test en ajoutant l'argument --coverage-html suivi du répertoire dans lequels sera stocker les informations sur la couverture de notre code.

./vendor/bin/phpunit --coverage-html ./code_coverage

A la fin de l'exécution du test, on peut voir que phpunit nous a bien créé le dossier contenant notre code coverage.

Ouvrez le fichier code_coverage/index.html avec votre navigateur. Vous tomberez alors sur un joli dashboard rempli d'information intéréssante.

Dashbord 1
Cliquez sur la classe Math.php et vous obtiendrez des informations plus précises. On peut observer qu'une partie de notre code n'est pas couvert par nos tests. La condition retournant 'je suis un code secret' dans la méthode "double" ne sera jamais éxecuté par nos tests. Par ailleurs, on s'apercoit que la méthode "triple" est à 100% couverte.
Dashboard 2

PHPUnit nous propose la un bel outil et il ne faut pas s'en priver et en plus c'est simple à utiliser. Maintenant le grand débat, faut il couvrir son code à 100% ? smile