Aller au contenu principal

Tests unitaires

Comment tester votre application Symfony avec des tests unitaires et fonctionnels

Schéma

Petite vérification​

Avant de commencer, vérifiez si vous savez déjà répondre à ces 3 questions très simples (si c'est le cas, vous avez tout ce qu'il faut pour écrire votre premier test) :

  1. citer le mot-clé PHP qui permet de créer une nouvelle instance d'une classe
  2. citer la syntaxe qui permet d'appeler une méthode sur un objet (par exemple la méthode getName() sur un objet $player)
  3. citer l'extension de fichier utilisée pour une classe PHP
📌 Réponse attendue
astuce

Un test PHPUnit n'est qu'une classe PHP ordinaire, qui crée des objets et appelle leurs méthodes comme vous le faites déjà. Rien de nouveau à apprendre sur ce point avant de commencer.

Notions théoriques​

Les tests sont une partie essentielle de tout développement de logiciel. Ils vous permettent de vérifier que votre code fonctionne comme prévu, et de détecter les régressions lorsque vous modifiez votre code.

Symfony fournit des outils pour écrire à la fois des tests unitaires, qui testent des parties spécifiques de votre code en isolation, et des tests fonctionnels, qui testent le comportement de votre application dans son ensemble.

Schéma

Exemple de mise en application​

Pour écrire un test unitaire, vous pouvez créer une nouvelle classe dans le dossier tests/ de votre application. Par exemple, pour tester notre entité Player, nous pourrions créer une classe PlayerTest :

namespace App\Tests;

use App\Entity\Player;
use PHPUnit\Framework\TestCase;

class PlayerTest extends TestCase
{
public function testName(): void
{
$player = new Player();
$player->setName('Player1');

$this->assertSame('Player1', $player->getName());
}
}

Pour écrire un test fonctionnel, vous pouvez utiliser la classe WebTestCase de Symfony, qui fournit des méthodes pour simuler des requêtes HTTP à votre application. Par exemple, pour tester notre action de création de personnage, nous pourrions créer une classe GameControllerTest :

namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class GameControllerTest extends WebTestCase
{
public function testCreateCharacter(): void
{
$client = static::createClient();
$crawler = $client->request('GET', '/game/create-character/1');

$this->assertResponseIsSuccessful();
$this->assertSelectorTextContains('h1', 'Character created!');
}
}

Test de mémorisation/compréhension​


Quelle est la différence entre un test unitaire et un test fonctionnel ?


Comment écrit-on un test unitaire dans Symfony ?


Comment écrit-on un test fonctionnel dans Symfony ?


Comment simule-t-on une requête HTTP dans un test fonctionnel dans Symfony ?


Comment vérifie-t-on qu'une réponse est réussie dans un test fonctionnel dans Symfony ?



TP pour réfléchir et résoudre des problèmes​

Votre défi pour aujourd'hui consiste à écrire des tests pour votre application

Test 1 : Écrivez un test unitaire pour l'entité Character qui vérifie que getName() retourne la valeur définie.

Test 2 : Écrivez un test fonctionnel pour l'action createCharacter du GameController.


Bonne pratique - Écrire les tests en même temps que le code

Un test écrit après coup est souvent oublié ou bâclé. Écrire le test en même temps que l'entité ou la méthode force à réfléchir à son comportement attendu dès la conception. Les tests unitaires sur les entités (getters / setters / logique métier) sont les plus rapides à écrire et à exécuter, et détectent immédiatement les régressions lors des refactorisations.

📌 Une solution