Tutoriel Vidéo PHPUnit Tests unitaires, PHPUnit

Télécharger la vidéo Télécharger les sources

Dans ce tutoriel vidéo je vous propose de découvrir les tests unitaires et le principe du TDD, Test Driven Development. Les tests unitaires vous permettent d'écrire une série de test pour valider le bon fonctionnement de vos méthodes et de vous assurer qu'elles continuent à fonctionner au fil de vos refactoring.

Installation

Pour écrire nos tests nous allons utiliser PHPUnit qui peut désormais être installer via composer.

composer require phpunit/phpunit

Une fois phpunit installé on peut le lancer depuis le dossier bin de composer

./vendor/bin/phpunit

Pour configurer le fonctionnement de nos tests nous allons passer par l'utilisation d'un fichier XML qui permettra de définir la configuration de base de nos tests.

<?xml version="1.0" encoding="utf-8" ?>
<phpunit colors="true">
    <testsuite name="Mes super tests">
        <directory>./tests</directory>
    </testsuite>
    <filter>
        <whitelist proceessUncoveredFromWhitelist="true">
            <directory suffic=".php">src/</directory>
        </whitelist>
    </filter>
</phpunit>

Dans notre cas les tests se situeront dans un dossier tests à la racine de notre application.

Notre premier test

Pour écrire un test il suffit de créer une classe qui hérite de la class PHPUnit_Framework_TestCase et qui contiendra des méthodes commençant par test.

<?php
class UselessTest extends PHPUnit_Framework_TestCase
{

    public function testMultiplication(){
        $this->assertEquals(4, 2*2);
    }

}

Afin de vérifier qu'une variable est bien celle attendue on utilisera des assertions.

Stub

Parfois les classes que l'on teste font appel à d'autres objets que l'on a parfois besoin de contrôler. Par exemple si on teste une classe interrogeant une API externe on va chercher à modifier la fonction afin de simuler un "faux" résultat plus prévisible.

// Créer une instance que l'on va pouvoir modifier
$stub = $this->getMockBuilder('MaSuperClass')->getMock();
// On remplace la méthode getLastPost() et on retourne ce que l'on veut
$stub->method('getLastPost')->willReturn(['name' => 'Mon article', 'content' => 'fake content']);
$this->assertEquals('Mon article', $stub->first()['name']);

Mocks

Un mock est une sorte de stub qui nous permet en plus de définir une attente au niveau de l'objet afin de vérifier qu'une méthode soit bien appellée par exemple.

// On crée un mock 
$observer = $this->getMockBuilder('MaSuperClass')
  ->setMethods(array('getLastPost'))
  ->getMock();

// On précise les attentes concernant la méthode getLastPost
$observer->expects($this->once())
  ->method('getLastPost')
  ->with($this->equalTo('blabla'));

// On déroule notre code normalement
$observer->get();