Chapitre 2.8 : Test d'API
Temps d'étude : 1 heure
1. Pourquoi les tests sont-ils nécessaires ?
Imaginez que vous ayez construit un vaisseau spatial. Avant de l'envoyer sur Mars, vous effectuez des milliers de vérifications sur Terre. Les tests en programmation, c'est la même chose. Ils :
- Donnent confiance : Vous pouvez modifier le code, et si les tests passent, cela signifie que vous n'avez rien cassé.
- Économisent du temps : Au lieu de "cliquer" manuellement sur tout dans Postman après chaque modification, vous exécutez une seule commande qui vérifie tout pour vous en quelques secondes.
- Servent de documentation : De bons tests montrent comment votre API est censée fonctionner.
2. Configuration du "Laboratoire" de test
Laravel rend la configuration des tests incroyablement simple. Par défaut, il utilise une configuration distincte afin de ne pas affecter votre base de données principale.
Base de données pour les tests :
Par défaut, Laravel utilise une base de données en mémoire (:memory:
). C'est la méthode la plus rapide car il n'est pas nécessaire d'écrire quoi que ce soit sur le disque. La base de données est créée avant les tests et détruite après. Nous n'avons même rien à configurer pour cela !
Création du fichier de test : Créons un fichier spécial pour les tests liés aux planètes.
Cette commande créera le fichier tests/Feature/PlanetApiTest.php
. Le mot Feature
signifie que nous allons tester la fonctionnalité dans son ensemble (par exemple, "l'utilisateur peut-il créer une planète ?"), et non une petite classe individuelle.
3. Anatomie d'un test : Préparation, Action, Vérification
Ouvrez tests/Feature/PlanetApiTest.php
. Nous y écrirons notre premier test. Un bon test se compose toujours de trois parties (Arrange, Act, Assert).
<?php
namespace Tests\Feature;
use App\Models\Planet; // N'oubliez pas d'importer le modèle
use Illuminate\Foundation\Testing\RefreshDatabase; // L'outil le plus important !
use Tests\TestCase;
class PlanetApiTest extends TestCase
{
// Ce trait "nettoie" et recrée "magiquement"
// notre base de données de test avant chaque test.
// Cela garantit que les tests ne s'affectent pas mutuellement.
use RefreshDatabase;
/**
* Test : le point de terminaison pour obtenir la liste des planètes fonctionne correctement.
* Les noms des tests doivent être significatifs !
*/
public function test_can_get_all_planets(): void
{
// 1. PRÉPARATION (Arrange)
// Nous créons 3 planètes factices dans notre base de données de test
// à l'aide de la fabrique que nous avons créée précédemment.
Planet::factory()->count(3)->create();
// 2. ACTION (Act)
// Nous simulons une véritable requête GET vers notre API.
$response = $this->getJson('/api/planets');
// 3. VÉRIFICATION (Assert)
// Nous vérifions que tout s'est passé comme prévu.
$response->assertStatus(200); // Nous nous attendons à ce que le serveur réponde "200 OK"
$response->assertJsonCount(3); // Nous nous attendons à exactement 3 planètes dans la réponse
}
}
use RefreshDatabase
: Ce trait est votre meilleur ami. Il garantit que chaque test commence avec une "table rase", avec une base de données vide.Planet::factory()
: Les fabriques sont idéales pour créer des données de test.$this->getJson()
: C'est une méthode Laravel spéciale pour envoyer des requêtes API à l'intérieur des tests.assert...()
: Ce sont des "assertions" ou des "vérifications". Si au moins l'une d'entre elles échoue, le test échouera.
4. Test des opérations principales (CRUD)
Écrivons des tests pour la création, la mise à jour et la suppression de planètes.
A. Test de création de planète (POST)
<?php
public function test_can_create_a_planet(): void
{
// 1. Préparation : préparation des données pour une nouvelle planète
$planetData = [
'name' => 'Kepler-186f',
'description' => 'La première exoplanète de la taille de la Terre dans la zone habitable.',
'size_km' => 14000,
'solar_system' => 'Kepler-186'
];
// 2. Action : envoi d'une requête POST avec les données
$response = $this->postJson('/api/planets', $planetData);
// 3. Vérification
$response->assertStatus(201); // Nous nous attendons au statut "201 Created"
$response->assertJsonFragment(['name' => 'Kepler-186f']); // Nous vérifions que le nom créé est présent dans la réponse
// La vérification la plus importante : les données ont-elles vraiment été ajoutées à la base de données ?
$this->assertDatabaseHas('planets', [
'name' => 'Kepler-186f'
]);
}
B. Test de suppression de planète (DELETE)
<?php
public function test_can_delete_a_planet(): void
{
// 1. Préparation : création de la planète à supprimer
$planet = Planet::factory()->create();
// 2. Action : envoi d'une requête DELETE
$response = $this->deleteJson("/api/planets/{$planet->id}");
// 3. Vérification
$response->assertStatus(204); // Nous nous attendons à "204 No Content" - suppression réussie
// Nous vérifions que l'enregistrement a bien disparu de la base de données
$this->assertDatabaseMissing('planets', [
'id' => $planet->id
]);
}
5. Test des "mauvais" scénarios
Tester les cas réussis est une bonne chose. Mais il est encore plus important de tester les erreurs !
A. Test d'erreur de validation
<?php
public function test_creation_fails_with_invalid_data(): void
{
// 2. Action : envoi de données sciemment incorrectes
$response = $this->postJson('/api/planets', ['name' => '']); // Nom vide
// 3. Vérification
$response->assertStatus(422); // Nous nous attendons à "422 Unprocessable Entity"
$response->assertJsonValidationErrors('name'); // Nous nous attendons à ce que l'erreur se trouve spécifiquement dans le champ 'name'
}
B. Test de "non trouvé" (404)
<?php
public function test_returns_404_for_non_existent_planet(): void
{
// 2. Action : demande d'une planète avec un ID inexistant
$response = $this->getJson('/api/planets/99999');
// 3. Vérification
$response->assertStatus(404); // Nous nous attendons à "404 Not Found"
}
6. Exécution des tests
Maintenant que les tests sont écrits, les exécuter est très simple. Exécutez dans le terminal :
Laravel trouvera tous vos tests et les exécutera un par un. Si tout se passe bien, vous verrez une sortie verte. Si un test échoue, vous verrez une sortie rouge avec une description détaillée de l'erreur, ce qui vous permettra de la corriger rapidement.
Pour exécuter un seul fichier spécifique :
8. Couverture de code (Code Coverage)
Étape 1 : Installation de Xdebug
Pour collecter les informations de couverture de code, l'extension PHP Xdebug est requise.
Envoyez votre
php -i
au wizard et suivez les instructions.
Étape 2 : Configuration de phpunit.xml
<phpunit ... >
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">./app</directory>
</include>
</coverage>
</phpunit>
Étape 3 : Exécution avec rapport
Rapport : Ouvrezcoverage/index.html
dans le navigateur
9. Intégration avec Postman
Automatisation via Newman :
- Exportez la collection Postman vers
tests/Postman/SpaceApi.postman_collection.json
- Installez Newman :
- Ajoutez le script dans
composer.json
: - Exécution :
Quiz pour la consolidation
🚀 Résumé du chapitre : Vous avez effectué un cycle complet de tests de pré-lancement ! Votre API peut désormais :
- ✅ Configurer l'environnement de test sans effort supplémentaire
- 🛡️ Écrire des tests basés sur le principe "Préparation-Action-Vérification".
- 📊 Tester les scénarios réussis (CRUD) ainsi que les erreurs (validation, 404).
- 🔁 Exécuter les tests avec une seule commande et être confiant dans votre code.
Le vaisseau spatial est prêt pour le lancement ! Vous avez terminé la section sur la création d'une API avec Laravel.
📌 Vérification finale :
- Exécutez
php artisan test
- Assurez-vous que tous les tests passent (lumière verte !)
- Vérifiez le rapport de couverture
⚠️ Si les tests échouent :
- Vérifiez le fonctionnement de l'API via Postman
- Assurez-vous que la base de données de test est configurée
- Utilisez
dd($response->content())
pour le débogage
Félicitations pour l'achèvement du Chapitre 2 ! Vous n'avez pas seulement créé une API, vous avez construit un "vaisseau spatial" fiable et testé, prêt pour de futures missions.
🌌 Prochaines étapes :
- Configuration de l'authentification (Sanctum)
- Documentation de l'API avec Swagger
- Déploiement sur un serveur (Forge, VPS)
- Développement du frontend avec Vue/React
Bon lancement pour votre mission spatiale ! Dans le prochain chapitre, nous aborderons la création d'une API à partir de zéro 🚀