Tests fonctionnels dans une application Symfony2 avec PHPUnit

Tests fonctionnels dans une application Symfony2 avec PHPUnit

Publié le 16/12/2015

L'objectif est de mettre en place des tests fonctionnels dans une application Symfony. On va créer des tests simples qui pourrons nous servir de modèles lors d'implémentations futures. PHPUnit est le framework de test qui va nous permettre d'accomplir tout cela.

1 - Installation de PHPUnit

Ajouter dans la section require du fichier composer.json les lignes suivantes :


"phpunit/phpunit": "5.4.*",
"symfony/browser-kit": "2.7.*",
"symfony/css-selector": "2.7.*"

On lance un composer update :


php composer.phar update

2 - Paramétrage de PHPUnit dans Symfony

Dans le répertoire /app de notre application, on va dupliquer le fichier phpunit.xml.dist et le renommer en phpunit.xml.

On va ensuite créer un répertoire Tests dans le bundle de notre application :


mkdir src/AppName/MainBundle/Tests

3 - Création des tests

3.1 - Test de chargement des pages

Notre premier test consiste à tester le bon chargement des pages de notre site.

On va créer une class AppTest qui va étendre la class WebTestCase de PHPUnit :


nano app/src/AppName/MainBundle/Tests/AppTest.php


<?php

namespace AppName\MainBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class AppTest extends WebTestCase
{
	public function testPageIsSuccesful()
	{
		$client = static::createClient();

		foreach ($this->provideUrls() as $url) {
			$client->request('GET', $url);
			$this->assertTrue($client->getResponse()->isSuccessful());
		}

	}

	private function provideUrls()
	{
		return array(
			'/',
			'/page/'
		);
	}
}

3.2 - Test de présence d'une chaine de caractère dans une page

On souhaite tester la présence d'une chaine de caractère dans une page. Pour cela, on va ajouter une nouvelle méthode dans notre class AppTest :


public function testHomePage()
	{
		$client = static::createClient();

		$crawler = $client->request('GET', '/');
		$this->assertEquals('AppName\FrontBundle\Controller\PageController::indexAction', $client->getRequest()->attributes->get('_controller'));
		$this->assertTrue(200 == $client->getResponse()->getStatusCode());
		$this->assertTrue($crawler->filter('h1:contains("Home Page")')->count() == 1);
	}

Notre test cherche à savoir si la page contient la chaine "Home Page" dans une balise h1.

3.3 - Test du résultat d'une requête

On souhaite tester le résultat d'une requête dans l'entité User :


public function testQuery()
	{
		$resultExpected = 'toto';

		$kernel = static::createKernel();
		$kernel->boot();

		$user = new User();
		$user->setName($resultExpected);

		$em = $kernel->getContainer()->get('doctrine.orm.entity_manager');

		$result = $em->getRepository('AppNameMainBundle:User')->getUserToto($resultExpected);
		$result = $result->getName();

		$this->assertEquals($resultExpected, $result);
	}

4 - Exécution des tests

On lancer l'exécution du test à partir du terminal :


vendor/phpunit/phpunit/phpunit -c app/