Tests Unitaires et fonctionnels
Nous avons vu comment vérifier des éléments du codage, mais il faut également s'assurer que le code produit correspond bien aux spécifications du projet.
Pour cela, nous avons plusieurs sortes de tests à notre disposition. Nous aborderons les tests unitaires et les tests fonctionnels.
Tester sous Symfony
Symfony étant un projet PHP, il s'appuie sur l'outil phpunit pour gérer les tests.
En suivant la documentation, il faut ajouter une dépendance à notre projet.
Le projet sur lequel on s'appuie pour cette semaine est déjà configuré, mais si on veut ajouter les tests à un projet, il faut faire :
composer req --dev symfony/test-pack
Cela installe tout ce qu'il faut et notamment l'outil phpunit
Dans Symfony, vous connaissez déjà l'environnement de développement, celui de production, mais il existe également celui de test. C'est-à-dire, qu'on va pouvoir avoir des réglages spécifiques dans cet environnement et notamment une base de données dédiée.
Regardez le fichier .env.test et vous pouvez remarquer qu'il contient une définition différente pour la base de données :
DATABASE_URL=mysql://root:root@db:3306/devops?serverVersion=10.11.8-MariaDB
Cette base nous sera utile, car nous pouvons définir dessus un jeu de données spécifique et ce sera sur celle-ci que les tests seront réalisés.
Il va falloir créer cette base, les tables du projet et charger le jeu de données.
make bash
cd <nom du projet>
bin/console doctrine:database:create --env=test
bin/console doctrine:migration:migrate --env=test
bin/console doctrine:fixture:load --env=test
Pour créer un nouveau test, il suffit de lancer la commande suivante :
bin/console make:test
5 choix sont disponibles :
- TestCase pour les tests unitaires
- KernelTestCase pour tester les services (non abordé ici)
- WebTestCase pour les tests fonctionnels
- ApiTestCase pour tester son API Rest (non abordé ici)
- PantherTestCase pour tester la partie front, JS compris (non abordé ici)
Les méthodes de tests doivent obligatoirement commencer par le mot test pour être pris en compte par phpunit.
Asserts et Tests
Quand on utilise phpunit, il faut dissocier les tests et les asserts.
- Un test est une méthode exécutée à l'intérieur de la classe de Test
- Un assert est une méthode de la classe héritée et qui permet d'affirmer quelque chose. Chaque affirmation doit être vraie pour que le test soit bon.
Le résultat peut être de la forme :
Tests: 5, Assertions: 8, Failures: 1.
Cela signifie que :
- 5 tests différents ont été exécutés à travers 5 méthodes qui commencent par le mot test.
- 8 asserts ont été réalisées
- 1 fonction est en erreur à cause d'1 assert (affirmation) fausse
Dans ce cas, le test a échoué.
Les tests unitaires
Les tests unitaires permettent de vérifier qu'une fonction ou une méthode fait bien ce qu'elle doit faire.
Dans le projet de la sirène qui est simple, il n'y a pas grand-chose à tester de ce côté-là. Pour la compréhension du principe, je vous ai mis à disposition une méthode statique dans le contrôleur par défaut qui calcule la moyenne d'un tableau. Vous pouvez voir dans le fichier tests/UnitTest.php la manière de tester cette fonction.
En utilisant la complétion de code de votre IDE, lister toutes les commandes assert disponible pour les tests unitaires.
Les tests fonctionnels
Les tests fonctionnels vont pouvoir tester les contrôleurs, la base de données ainsi qui les vues twig. Observez le fichier Tests/FunctionalTest.php, vous pouvez y voir 4 tests différents :
- testPageAccueil vérifie si la vue de la page d'accueil possède un titre h2 contenant le mot concerts
- testNbConcertsPageAccueil vérifie si le nombre de concerts affichés est conforme à la demande (seuls les concerts confirmés doivent apparaitre)
- testConnexionAdmin vérifie qu'on se connecte bien au backoffice en étant connecté en admin. Easyadmin fait une redirection en cas de connexion réussie (code http 302)
- testConnexionUser vérifie qu'on ne peut pas se connecter au backoffice en tant que simple user (code http 403 pour accès interdit)
- testNewsletter vérifie que le formulaire fonctionne, et inscrit bien une nouvelle personne en base
En utilisant la complétion de code de votre IDE, lister toutes les commandes assert disponible pour les tests fonctionnels.
Couverture de code
Il est important de vérifier que tous les cas possibles sont testés. Pour cela, on peut utiliser la couverture de code. Pour lancer les tests avec la couverture de code, il suffit de lancer la commande suivante :
bin/phpunit --coverage-html tests/coverage
Cela va générer un rapport html dans le dossier tests/coverage. Ouvrez le fichier index.html pour voir la couverture de code. Si les tests d'un projet sont bien réalisés, on devrait avoir une couverture de code de 100%.
Lancement des tests
Pour lancer les tests, c'est très simple, il suffit d'utiliser la commande phpunit dans le conteneur php de votre application :
bin/phpunit
Exercice
Les tests échouent, car il y a un problème avec la méthode testNbConcertsPageAccueil : le nombre attendu est inférieur à la réalité, parce que tous les concerts sont affichés. Corrigez le projet pour que le test passe. Seuls les concerts actifs doivent être affichés.
Relancez les tests afin qu'ils passent tous.