Tester l'API REST Symfony avec PHPUnit

Comme dans tout projet logiciel, il est primordial de supporter le développement de fonctionnalités par une suite de tests solide. Le logiciel devra évoluer et le code devra être modifié (réusinage), pour ces deux raisons, un filet de sécurité est essentiel : les tests.

Il est possible d’écrire des tests unitaires et fonctionnels. Dans cet article, des tests fonctionnels seront mis en place. Il sont plus lents, mais permettront de tester l’application de point à point. Dans ces tests, un crawler sera initialisé et lancera des requêtes de types GET, POST, PUT et DELETE sur notre API REST. Par la suite, il sera possible de vérifier que l’API REST réagisse correctement aux requêtes lancées avec des vérifications (assert) fournies par PHPUnit.

Tests fonctionnels pour un API REST

La première méthode rencontrée est setUp(), elle permet de réinitialiser chaque test dans un état connu. Dans le cas qui nous concerne, les fixtures seront injectées dans la base de données.

/src/Acme/Bundle/ApiBundle/Tests/Controller/Rest/CommentController.php

Tester la sécurité

La méthode testGetCommentsWithoutToken() lance une requête GET afin de vérifier qu’une ressource est bien protégée, le serveur devrait retourner un code 401 (Unauthorized).

/src/Acme/Bundle/ApiBundle/Tests/Controller/Rest/CommentController.php

Tester la réponse GET de l’API REST

La méthode testGetComments() lance une requête GET afin de vérifier que la réponse du serveur est celle attendue, le serveur devrait retourner un objet Comment sérialisé (JSON) ainsi que le code 200.

Avant de faire cette requête, un client authentifié est créé avec la méthode createAuthenticatesClient(), ce client aura en sa possession un JWT valide.

/src/Acme/Bundle/ApiBundle/Tests/Controller/Rest/CommentController.php

Tester le bon fonctionnement d’une requête POST

Cette fois-ci, une requête POST est envoyée. On vérifier que le résultat est celui attendu et accompagné d’un code 201 (Created)

/src/Acme/Bundle/ApiBundle/Tests/Controller/Rest/CommentController.php

Tester la robustesse et les validations

Il est aussi important de vérifier que nos règles de validations sont bonnes. Dans le cas suivant, on s’assure que le code 410 est retourné. Il serait aussi bon de vérifier que le message retourné est celui attendu.

Exécuter les tests pour votre API REST

Vous pouvez lancer l’exécution de vos tests avec la commande suivante :

Avant Symfony 2.8, vous devrez utiliser la variante suivante :

PHPUnit en ligne de commande

Arrêter les tests lorsque ça va mal

Aussitôt qu’une erreur est rencontrée, PHPUnit affichera le message d’erreur.

Exécuter quelques tests seulement

Il est possible de filtrer les tests à exécuter de la manière suivante :

https://phpunit.de/manual/current/en/textui.html

Afin de filtrer les tests à exécuter, il est aussi possible de modifier le fichier phpunit.xml et de créer des suites :

Modifier le format de sortie des tests

De base, PHPUnit n’affiche pas le titre des tests, mais le caractère point. Afin d’afficher les titres des tests, il est possible d’utiliser –testdox :

Plutôt que :

Couverture du code

PHPUnit offre aussi le possibilité de générer un rapport sur la couverture de code par vos tests.

Vider la cache

Note

Même lors de l’exécution des tests, Symfony utilise un système de cache. Si les tests ne s’exécutent pas comme prévu et que les résultats sont louches, il faut peut-être vider la cache avec l’option –env=test.

 

Pre-commit hook

Il est possible de configurer git afin d’exécuter un script lors d’un commit avec un pre-commit hook. Il suffit de créer le script et de l’activer en le déposant dans le dossier .git/hook.

Exemple de hook shell

Lance les tests pour un projet Symfony >= 2.8 :

Lance les tests pour un projet Symfony < 2.8 :

Exemple de hook php

Il est aussi possible de créer un script php.

Activer un hook

Afin d’activer un hook, il suffit de créer un lien symbolique dans le dossier caché .git/hooks.

Hook pour un projet Symfony

Un petit extra pour les projets Symfony.

https://github.com/hoangthienan/symfony-pre-commit

Facebook Comments

0 réponses

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.