Le taux de couverture de code n’est pas un indicateur parfait, on le sait.
Comme beaucoup, ce qui est intéressant c’est d’observer la tendance et l’évolution, sans se focaliser sur les valeurs absolues, qui sont toujours imparfaites et contournable par quiconque ait envie de le faire. Ce qui est intéressant avec les rapports de couverture notamment, c’est de voir quelles lignes de code sont couvertes par un test.
Quand on traite du code à remanier, non testé, et que l’on veut inverser la tendance, c’est en effet un moyen assez indispensable quand on veut commencer à injecter des pratiques de types clean code ou autre, et ce de manière sécurisée.
Le pattern pour traiter ce genre de code c’est donc:
- générer le rapport de couverture
- écrire un test passant qui couvre le code visé
- remanier le code
- vérifier que le test passe toujours
Bien évidemment on peut avoir besoin de plusieurs tests couvrant plusieurs cas métier, mais la mécanique restera identique.
Reste un point à corriger: comment faire quand on a plusieurs types de tests, potentiellement exécutés par plusieurs outils?
C’est préférable d’avoir un seul indicateur global, plus facile à suivre et communiquer . Avec PHPUnit et Symfony, on a déjà la chance de pouvoir d’exécuter les tests unitaires et certains tests d’intégration/fonctionnel qu’on appelle sous-cutanés grâce aux WebTestCase et au PhpUnit Bridge de Symfony.
Mais comment faire avec un orcherstrateur de tests e2e comme Playwright ou Selenium?
La solution est toute simple et je vous la montre sur ce répo qui reprend l’application Symfony Demo. L’idée est de remplacer XDebug par PCov (plus rapide et léger) pour générer les données de couverture et de l’activer via un header HTTP pour Playwright par exemple. Le code de Symfony Demo contient quelques tests auxquels j’ai rajouté un test PlayWright.
L’execution des tests PHPUnit puis celle des tests e2e génére chacune des fichiers de trace de couverture. Le rapport HTML généré à la fin comprendra donc la couverture de tous les tests, on obtiendra ainsi un taux de couverture global.
Pour générer le rapport:
make coverageVous pouvez commenter l'une des 2 lignes du Makefile pour observer l'évolution de la couverture en fonction des tests executés.