neoDSI   CTO & Développeur back-end symfony
+33 6 62 75 87 89 Contact

Tests fonctionnels sous symfony2 avec phpunit

Avant d’écrire les tests

S’assurer que phpunit fonctionne avec la commande phpunit --version par exemple.

Lancer les tests avec la commande phpunit -c app/ et ajouter --coverage-html ~/report pour avoir la couverture de code. (si la couverture de code ne fonctionne pas c’est peut être parce que xdebug n’est pas utilisé).
Le répertoire report contiendra la couverture de code.

Phpunit s’appuie sur le fichier app/phpunit.xml.dist qui permet de spécifier des options, mais surtout dans la balise <testsuites> les répertoires où sont situés les tests ainsi que dans la balise <filter> les répertoires à couvrir pour la couverture de code (et dans <exclude> ceux à exclure).
On peut aussi dans la balise <php> fournir des variables spéciales comme par exemple le remote_addr :
<php><server name="REMOTE_ADDR" value="localhost" /></php>

L’écriture des tests

Les tests sont dans le dossier /tests dans l’installation standard de symfony.

Rien de bien particulier et tout se trouve sur la page http://symfony.com/fr/doc/current/book/testing.html

Pour une authentification HTTP basic

Il suffit d’envoyer un header autorization dans la requête et on préfixe avec http_ comme il s’agit d’un header, ce qui donne :

$aAuth = array(
    'HTTP_AUTHORIZATION' => 'Basic QWxhZGRpbjpvcGVuIHNlc2',
);
$crawler = $this->client->request('GET', '/getMonInfo', array(), array(), $aAuth);

Envoyer des données dans le content

$data = array(
    "id-info" => 96,
    "id-project" => 1,
    "version" => "1.0.0",
);
$crawler = $this->client->request('GET', '/getMonInfo', array(), array(), $aAuth, json_encode($data));

Assertion égale à deux valeurs possibles

L’assertion d’égalité permet de tester si une valeur correspond à une valeur attendue. Mais si la valeur attendu à 2 possibilités correctes alors on peut utiliser assertThat et logicalOr. Ici on a deux valeurs toto et tata qui sont correctes.

$respondOk1 = 'toto';
$respondOk2 = 'tata';
$content = $this->client->getResponse()->getContent();
$this->assertThat(
    $content,
    $this->logicalOr(
        $this->equalTo($respondOk1),
        $this->equalTo($respondOk2)
    )
);