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**.
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 :
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
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 :
-
Créez un dossier
tp-tests-unitaires
dans votre dossierDocuments
. -
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
- Modifiez votre fichier
composer.json
:
...
"psr-4": {
"App\\": "src/"
}
...
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
Si vous utlisez Git dans votre projet, pensez à :
- créer créer un fichier
.gitignore
, à la racine de votre projet (dans le dossiertp-tests-unitaires
) - ajouter le dossier
vendor
dans ce fichier.gitignore
.
- Dans le dossier
src
, créez un fichierCharacter.php
:
class Character {
public $name;
public $health;
public $strength;
public function __construct($name, $health, $strength) {
$this->name = $name;
$this->health = $health;
$this->strength = $strength;
}
}
Pensez à importer vos classes.
- Dans le dossier
src
, créez un fichierFight.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
}
}
}
-
Installez
phpunit
:
Avec PHP 8, il est conseillé d'installer une version 10 ou supérieure de PHPUnit.
composer require --dev phpunit/phpunit:^10
-
Dans le dossier
tp-tests-unitaires
créer un dossiertests
. -
Dans le dossier
tests
, créez un fichierFightTest.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éscharacter1
etcharacter2
. -
Un test pour vérifier que la méthode
start
de la classeFight
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