Laravel 5 - Tests unitaires

1 1 1 1 1 1 1 1 1 1 Rating 5.00 (2 Votes)
Submit to DeliciousSubmit to DiggSubmit to FacebookSubmit to Google PlusSubmit to StumbleuponSubmit to TechnoratiSubmit to TwitterSubmit to LinkedIn

Les tests unitaires consistent à tester individuellement les composants de l’application. On pourra ainsi valider la qualité du code et les performances d'un module.

Cet article fait suite à l'article Laravel 5 - Construire une application CRUD. Une des grandes préoccupations des développeurs de logiciels est d’être certains que leur application informatique fonctionne et surtout qu’elle fonctionne dans toutes les situations possibles. Nous avons tous déjà vu notre système d’exploitation planter. Donc dans cet article nous allons réaliser des tests de notre application.

Les  3 étapes de la construction d'un test

Pour construire un test on procède généralement en trois étapes :

  1. Initialiser les données
  2. Agir sur ces données
  3. Vérifier que le résultat est conforme à notre attente

Prenons un exemple, modifiez maintenant le fichier tests/ExampleTest.php et la fonction testBasicExample par :

    public function testBasicExample()
    {
        $data = [15, 10, 5, 20];
        $result = array_sum($data);
        $this->assertEquals(50, $result);
    }

On retrouve nos trois étapes.

    public function testBasicExample()
    {
        //  On initialise les données
        $data = [15, 10, 5, 20];
        //  On agit sur les données
        $result = array_sum($data);
        //  On teste le résultat
        $this->assertEquals(50, $result);
    }

La méthode assertEquals permet de comparer deux valeurs, ici 50 et $result. Si vous lancez le test vous obtenez :

OK (1 test, 1 assertion)

Vous voyez à nouveau l'exécution d'un test et d'une assertion. Le tout s'est bien passé. Changez la valeur 50 par une autre et vous obtiendrez ceci :

FAILURES!

Tests: 1, Assertions: 1, Failures: 1.

Tester notre application

Nous allons maintenant tester notre application. Pour cela, créez le fichier tests/Http/Controllers/TasksControllerTest.php :

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class TasksControllerTest extends TestCase
{
    /**
     * Display a listing of the resource.
     *
     * @return void
     */
    public function testIndex()
    {
        $response = $this->action('GET', 'TasksController@index');
        $this->assertResponseOk();
    }
}

Ce test permet de tester le controlleur TasksController. Exécutez ensuite la commande ci-dessous :

phpunit

Il n'y a pas vraiment de règle quant à la constitution des tests, quant à ce qu'il faut tester ou pas. L'important est de comprendre comment les faire et de juger ce qui est utile ou pas selon les circonstances.

Il est important de bien organiser les tests pour s'y retrouver. Une bonne façon de procéder est d'adopter la même architecture de dossiers que celle prévue pour l'application.

Vous pouvez maintenant regarder comment sont réaliser les tests de l'application.

Ajouter un rapport de couverture de code

Insérez le code ci-dessous dans le fichier phpunit.xml à la racine de du projet.

    <logging>
        <log type="coverage-html" target="./report" charset="UTF-8"
             yui="true" highlight="true"
             lowUpperBound="50" highLowerBound="80" />
    </logging>

Ci-dessous le fichier complet :

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory suffix=".php">app/</directory>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html" target="./report" charset="UTF-8"
             yui="true" highlight="true"
             lowUpperBound="50" highLowerBound="80" />
    </logging>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>

Puis dans le fichier .gitignore ajouter /report comme ci-dessous :

/vendor
/node_modules
Homestead.yaml
Homestead.json
.env
/.idea
/build
/report

Maintenant quand vous exécutez la commande ci-dessous, le rapport est généré :

phpunit

Pour le consulter, allez à l'adresse http://localhost/local/tasks/report/

198 laravel 5 tests unitaires 01

Pour visualiser la couverture de code du contrôleur TasksController : http://localhost/local/tasks/report/Http/Controllers/TasksController.php.html

198 laravel 5 tests unitaires 02

Et à l'adresse http://localhost/local/tasks/report/dashboard.html pour visualiser le tableau de bord :

198 laravel 5 tests unitaires 03

Documentation

En résumé

  • Laravel utilise PHPUnit pour effectuer les test unitaires.
  • En plus des méthodes de PHPUnit on dispose d'helpers pour intégrer les tests dans une application réalisée avec Laravel.
  • Le composant Mockery permet de simuler le comportement d'une classe et donc de bien isoler les tests.

Autres articles

Submit to DeliciousSubmit to DiggSubmit to FacebookSubmit to Google PlusSubmit to StumbleuponSubmit to TechnoratiSubmit to TwitterSubmit to LinkedIn