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/