Tester une application PHP - TDD

Nous allons à présent nous attaquer à une problématique fondamentale dans toute application qu’elle soit Web, mobile ou autres : Les tests.

TDD

TDD veut dire Test Driven Development c’est à dire Développement dirigé par les tests C’est une démarche mise en avant en Méthodologie Agile Elle consiste en général en l’application des points suivants:

  • écrire un test

  • vérifier qu’il échoue (car le code qu’il teste n’existe pas)

  • écrire juste le code suffisant pour passer le test

  • vérifier que le test passe

  • procéder à un refactoring du code, c’est-à-dire l’améliorer en gardant les mêmes fonctionnalités.

Intérêt de la démarche:

Les avantages principaux de cette démarche sont :

  • Préciser au mieux les spécifications du code et l’API envisagée

  • Ceci oblige à faire des choix de conception qui restent parfois trop dans le flou au début du développement

  • Plus tard, disposer d’une large base de tests est une riche pour une application car elle permet de vérifier à tout moment que les tests installés ne sont pas mis en défaut par de nouveaux développements ou des refactoring de code

Tous les langages de programmation disposent de Frameworks de tests. Par exemple Java offre JUnit.

PHP quand a lui propose PHPUnit. On peut l’installer via composer:

{
"require": {
    "phpunit/phpunit": "6.3.*",
},
"autoload": {
    "psr-0": {
        "Exemple": "src"
        }
    }
}
composer.phar install

Ecrivons à présent notre premier test dans le dossier Tests:

<?php
use Exemple\FileLoader;

class FileLoaderTest extends PHPUnit_Framework_TestCase
{
    public function testFileLoaderClassCanBeCreated()
    {
        $f = new FileLoader;
    }
}

Pour tester: Placer un fichier phpunit.xml à la racine de votre projet contenant:

<?xml version="1.0" encoding="UTF-8"?>

<!--

PHPUnit Configuration
=====================
Fichier de configuration standard de phpunit
-->
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         bootstrap="vendor/autoload.php"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
>
    <testsuites>
        <testsuite>
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Nous sommes prêts à lancer notre premier test:

phpunit

Ecrivons maintenant un peu de code pour nous permettre de passer notre premier test :

Nous allons compléter notre test par une vérification qu’un fichier situé dans les textit{fixtures} de test a bien été chargé :

<?php
class FileLoaderTest extends PHPUnit_Framework_TestCase
{
    public function testFileLoaderClassCanBeCreated()
    {
        $f = new FileLoader;
    }

    /**
    * Nous voulons récupérer le contenu d'un fichier via
    * une méthode get()
    */
    public function testFileLoaderCanLoadFileContent()
    {
        $f = new FileLoader;
        $r = $f->get(__DIR__.'/fixtures/simple.md');
        $this->assertEquals("Foo\n", $r);
    }
}
Puis si nous avons besoin de Mock Objects, nous installerons la librairie

mockery:

composer require --dev mockery/mockery