Test en PHP : frameworks et outils
La qualité du code est la base d'un projet web réussi. Pour les développeurs PHP, les tests ont cessé d'être une option pour devenir une étape obligatoire du développement. Dans cet article, nous analyserons trois outils clés : PHPUnit (standard de l'industrie), Pest (minimalisme moderne) et Codeception (tests d'intégration). Vous apprendrez à écrire des tests unitaires, à travailler avec des objets mock et à implémenter le TDD dans des projets PHP.
1. PHPUnit — le fondement des tests PHP
PHPUnit est la norme de facto pour les tests unitaires en PHP. Il fait partie de Symfony, Laravel et d'autres frameworks populaires.
Installation et test de base
composer require --dev phpunit/phpunitExemple d'un test simple pour une classe de calculatrice :
// src/Calculator.phpclass Calculator { public function add($a, $b) { return $a + $b; }}
// tests/CalculatorTest.phpuse PHPUnit\\Framework\\TestCase;
class CalculatorTest extends TestCase { public function testAddition() { $calc = new Calculator(); $this->assertEquals(4, $calc->add(2, 2)); }}Travail avec les objets mock
PHPUnit fournit un mécanisme intégré pour créer des bouchons (mock) :
public function testUserRepository() { $mockRepo = $this->createMock(UserRepository::class); $mockRepo->method('findById') ->willReturn(new User(1, 'Alice'));
$service = new UserService($mockRepo); $result = $service->getUser(1); $this->assertEquals('Alice', $result->getName());}2. Pest — une syntaxe élégante pour les tests
Pest est une surcouche de PHPUnit offrant une syntaxe plus concise et lisible. Idéal pour les projets où la rapidité d'écriture des tests est importante.
Installation et exemple
composer require --dev pestphp/pestComparez avec PHPUnit : le même test dans Pest ressemble à ceci :
// tests/CalculatorTest.phpit('calculates addition', function () { $calc = new Calculator(); expect($calc->add(2, 2))->toBe(4);});Fonctionnalités avancées
- Higher Order Tests — chaînes d'appels sans imbrication
- Architecture Testing — vérification de la structure des classes
- Snapshot Testing — comparaison avec des données de référence
3. Codeception — pour les tests d'intégration et fonctionnels
Codeception combine les tests unitaires, fonctionnels et d'acceptation dans un seul framework. Il prend en charge Selenium, Symfony, Laravel, Yii et même WordPress.
Structure des tests
codecept generate:cest acceptance LoginCestExemple de test fonctionnel pour Laravel :
// tests/functional/UserCest.phpclass UserCest { public function testLogin(FunctionalTester $I) { $I->amOnPage('/login'); $I->fillField('email', 'user@example.com'); $I->fillField('password', 'secret'); $I->click('Login'); $I->see('Dashboard'); }}4. Outils supplémentaires
- Mockery — bibliothèque flexible pour les objets mock (alternative aux mocks intégrés de PHPUnit)
- PHPStan / Psalm — analyse statique, détectant les erreurs avant l'exécution des tests
- Infection — tests de mutation : vérifie la qualité des tests eux-mêmes
- PHP CodeSniffer — contrôle de conformité à PSR-12
5. Exemple pratique : TDD pour un service API
Implémentons un cycle TDD (Test-Driven Development) simple pour un service de commandes :
Étape 1. Écrire le test
// tests/OrderServiceTest.phppublic function testCrea Aussi dans la bibliothèque
Tests en Java : frameworks et outils essentiels
Lottie Swift : guide complet avec exemples
Métriques Prometheus en Rust : bibliothèques prometheus et metrics-exporter-prometheus
Client OAuth pour Java : ScribeJava et Spring Security OAuth2