TDD en PHP : développement piloté par les tests pour un projet réel

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi le TDD est-il devenu un standard pour les développeurs PHP ?

Imaginez : vous écrivez du code, vous l'exécutez, vous voyez une erreur, vous corrigez — et ainsi de suite. Cela vous semble familier ? Et maintenant, imaginez que vous écrivez d'abord un test qui échouera délibérément, puis le code minimal pour le faire passer, et seulement ensuite vous refactorisez. C'est ce qu'on appelle le TDD en PHP — le développement piloté par les tests, qui transforme le chaos en un système structuré.

De nombreux développeurs craignent le TDD : « Cela va ralentir le développement ! », « Je ne sais pas comment tester du code legacy », « PHPUnit, c'est compliqué ». Mais en pratique, le TDD fait gagner des heures de débogage et rend le code résistant aux changements. Dans cet article, nous allons décortiquer le TDD avec des exemples concrets en PHP, montrer comment fonctionne le cycle « rouge-vert-refactorisation », et fournir des modèles prêts à l'emploi pour sa mise en œuvre.



Qu'est-ce que le TDD et comment ça fonctionne en PHP ?

Le développement piloté par les tests (Test-Driven Development) est une méthodologie où les tests sont écrits avant l'implémentation. Le cycle de base ressemble à ceci :

  • Rouge — on écrit un test qui échoue (on s'attend à une erreur).
  • Vert — on écrit le code minimal pour que le test réussisse.
  • Refactorisation — on améliore le code sans changer son comportement.

En PHP, on utilise le plus souvent PHPUnit pour le TDD — un framework puissant pour les tests unitaires. Mais le TDD ne concerne pas les outils, mais la discipline. Voyons comment cela fonctionne en pratique.



Exemple 1 : Tester une calculatrice simple

Supposons que nous ayons besoin d'une fonction d'addition de deux nombres. Sans TDD, nous aurions écrit :

function add($a, $b) {    return $a + $b;}echo add(2, 3); // 5

Avec le TDD, nous écrivons d'abord le test :

use PHPUnit\\Framework\\TestCase;

class CalculatorTest extends TestCase { public function testAdd() { $calculator = new Calculator(); $result = $calculator->add(2, 3); $this->assertEquals(5, $result); }}

On exécute — le test échoue (rouge). On écrit l'implémentation minimale :

class Calculator {    public function add($a, $b) {        return $a + $b;    }}

Le test réussit (vert). La refactorisation n'est pas nécessaire — le code est simple. Mais si nous voulions ajouter la gestion des nombres négatifs, nous écririons d'abord un test pour ce cas.



Exemple 2 : TDD pour travailler avec une base de données

On dit souvent : « Le TDD ne convient pas aux bases de données ». C'est un mythe. Utilisez des mocks et des bases de données de test. Prenons l'exemple d'un UserRepository :

class UserRepositoryTest extends TestCase {    public function testFindUserById() {        $pdoMock = $this->createMock(PDO::class);        $stmtMock = $this->createMock(PDOStatement::class);                $pdoMock->method('prepare')                ->willReturn($stmtMock);        $stmtMock->method('fetch')                 ->willReturn(['id' => 1, 'name' => 'Alex']);                $repository = new UserRepository($pdoMock);        $user = $repository->findById(1);                $this->assertEquals('Alex', $user['name']);    }}

Le test vérifie que le dépôt appelle correctement le SQL et traite le résultat. Le code d'implémentation sera minimal : simplement exécuter la requête et retourner les données.



Outils populaires pour le TDD en PHP

Pour que le TDD fasse partie de votre workflow, vous devez maîtriser quelques outils :

  • PHPUnit — le framework principal pour les tests. Installation : composer require --dev phpunit/phpunit.
  • Mockery — une bibliothèque pour créer des mocks avec une API flexible.
  • Prophecy — une alternative à Mockery, souvent utilisée avec Symfony.
  • PHPStan / Psalm — analyse statique qui complète le TDD en trouvant des erreurs avant l'exécution des tests.

Pour les tests d'intégration, vous pouvez utiliser Laravel Dusk ou Symfony Panther, mais pour commencer, il suffit

Blogs

Book Recommendations