Aller au contenu principal

Les tests unitaires

Notions théoriques

Les tests unitaires sont une méthode de test qui vérifie la bonne fonctionnalité des parties individuelles (unités) de votre code.

Dans le cadre de la programmation orientée objet, une unité est généralement une** méthode d'une classe**.

info

PHPUnit est un framework de tests unitaires pour le langage de programmation PHP. Il fournit une structure pour créer des tests et exécuter ces tests sur votre code. Les tests unitaires peuvent aider à prévenir les bugs, faciliter les refontes et améliorer la conception du code.

Pour installer PHPUnit, vous pouvez utiliser Composer, le gestionnaire de dépendances pour PHP :

remarque

Avec PHP 8, il est conseillé d'installer une version 10 ou supérieure de PHPUnit.

composer require --dev phpunit/phpunit:^10

Une fois PHPUnit installé, vous pouvez créer un fichier de test pour chaque classe que vous souhaitez tester. Par convention, ces fichiers se terminent par Test.php et sont placés dans un répertoire tests.

:::

Exemple pratique

Prenons notre classe Character que nous avons développée pour notre jeu de combat.

Nous allons créer un test pour vérifier que notre méthode isAlive fonctionne correctement.

Créez un fichier tests/CharacterTest.php avec le contenu suivant :

<?php

use PHPUnit\Framework\TestCase;

class CharacterTest extends TestCase {
public function testIsAlive() {
$character = new Character('Guerrier', 100, 20);

// Le personnage doit être vivant après la création.
$this->assertTrue($character->isAlive());

// Si on réduit les points de vie à 0, le personnage doit être mort.
$character->hp = 0;
$this->assertFalse($character->isAlive());
}
}

Pour exécuter vos tests, vous pouvez utiliser la commande suivante :

./vendor/bin/phpunit tests

Test de mémorisation/compréhension


Qu'est-ce qu'un test unitaire ?


Qu'est-ce que PHPUnit ?


Comment s'appelle généralement un fichier de test pour une classe en PHP ?


Où place-t-on généralement les fichiers de test en PHP ?


Comment exécute-t-on les tests avec PHPUnit ?



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

Pour ce TP, vous allez écrire des tests unitaires pour une classe Fight d'un jeu de combat.

Vous devez tester le constructeur et la méthode start.

Voici les étapes à suivre :

  1. Créez un dossier tp-tests-unitaires dans votre dossier Documents.

  2. Dans le dossier tp-tests-unitaires, initialiser un projet avec Composer :

composer init
Package name (<vendor>/<name>) [bouquet/tp-tests-unitaires]:
Description []: Petit projet pour tester PHPUnit
Author [n to skip]: M. Bouquet
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
Add PSR-4 autoload mapping? Maps namespace "Bouquet\TpTestsUnitaires" to the entered relative path. [src/, n to skip]:

Do you confirm generation
  1. Modifiez votre fichier composer.json :
  ...
"psr-4": {
"App\\": "src/"
}
...
astuce

Pour mettre à jour les chemins de Composer après avoir modifier l'entrée "psr-4" de l'autoload de votre fichier composer.json, il suffit de saisir la commande :

composer dump-autoload

remarque

Si vous utlisez Git dans votre projet, pensez à :

  • créer créer un fichier .gitignore, à la racine de votre projet (dans le dossier tp-tests-unitaires)
  • ajouter le dossier vendor dans ce fichier .gitignore.
  1. Dans le dossier src, créez un fichier Character.php :
class Character {
public $name;
public $health;
public $strength;

public function __construct($name, $health, $strength) {
$this->name = $name;
$this->health = $health;
$this->strength = $strength;
}
}
attention

Pensez à importer vos classes.

  1. Dans le dossier src, créez un fichier Fight.php :
require_once 'Character.php';

class Fight {
public $character1;
public $character2;

public function __construct(Character $character1, Character $character2) {
$this->character1 = $character1;
$this->character2 = $character2;
}

public function start() {
if ($this->character1->strength > $this->character2->strength) {
return $this->character1;
} else if ($this->character1->strength < $this->character2->strength) {
return $this->character2;
} else {
return null; // Il n'y a pas de vainqueur, donc on renvoie null
}
}
}
  1. Installez phpunit :

remarque

Avec PHP 8, il est conseillé d'installer une version 10 ou supérieure de PHPUnit.

composer require --dev phpunit/phpunit:^10
  1. Dans le dossier tp-tests-unitaires créer un dossier tests.

  2. Dans le dossier tests, créez un fichier FightTest.php. et écrivez le code des tests suivants :

  • Un test pour vérifier que le constructeur de la classe Fight initialise correctement les propriétés character1 et character2.

  • Un test pour vérifier que la méthode start de la classe Fight retourne le bon vainqueur.

Une fois que vous avez écrit vos tests, vous pouvez les exécuter en utilisant PHPUnit.

Voici la commande à utiliser pour exécuter vos tests :

./vendor/bin/phpunit tests/FightTest.php
  • Si vos tests passent, vous verrez un message indiquant que tous les tests ont réussi.
  • Si vos tests échouent, vous verrez un message indiquant quels tests ont échoué et pourquoi.
Une solution

Voici comment pourrait ressembler votre fichier Character.php :

class Character {
public $name;
public $health;
public $strength;

public function __construct($name, $health, $strength) {
$this->name = $name;
$this->health = $health;
$this->strength = $strength;
}
}

Voici comment pourrait ressembler votre fichier Fight.php :

require_once 'Character.php';

class Fight {
public $character1;
public $character2;

public function __construct(Character $character1, Character $character2) {
$this->character1 = $character1;
$this->character2 = $character2;
}

public function start() {
if ($this->character1->strength > $this->character2->strength) {
return $this->character1;
} else if ($this->character1->strength < $this->character2->strength) {
return $this->character2;
} else {
return null; // Il n'y a pas de vainqueur, donc on renvoie null
}
}
}

Voici comment pourrait ressembler votre fichier FightTest.php :

<?php
require_once 'Character.php';
require_once 'Fight.php';

use PHPUnit\Framework\TestCase;

class FightTest extends TestCase {
public function testConstructor() {
$character1 = new Character('Guerrier', 100, 20);
$character2 = new Character('Monstre', 80, 15);
$fight = new Fight($character1, $character2);

// Vérifie que les personnages sont correctement initialisés.
$this->assertSame($character1, $fight->character1);
$this->assertSame($character2, $fight->character2);
}

public function testStart() {
$character1 = new Character("John", 100, 50);
$character2 = new Character("Jane", 100, 60);
$fight = new Fight($character1, $character2);

$winner = $fight->start();

$this->assertSame($character2, $winner);
}
}

Pour installer phpunit et exécuter les tests, ouvrez un terminal, naviguez jusqu'au répertoire de votre projet, puis exécutez les commandes suivantes :

Voici la commande à utiliser pour installer phpunit :

composer require --dev phpunit/phpunit:^10

Voici la commande à utiliser pour exécuter vos tests :

./vendor/bin/phpunit tests/FightTest.php