Je me suis lancé dans un side project pour gérer les rétrospectives de mon équipe, une application que je construis depuis plusieurs mois et dont j’ai décidé de raconter les coulisses de la création.
- 1/X - L’architecture technique
- 2/X - Le harness
- 3/X - Les tests automatisés (cet article)
L’architecture et le cadre fourni à l’IA ne suffisent pas à garantir ce qui va être produit. C’est pour cela qu’en plus de tout ça, de nombreux outils de vérification et de tests, cette fois-ci déterministes, ont été mis en place.
Si l’on devait comptabiliser le nombre de lignes de code par rapport au code de test ou qui vise à garantir le bon fonctionnement et l’alignement du code produit, la quantité de tests est supérieure à celle du code de production. Et c’est tout à fait explicable, puisque je mets moins les mains dans le code, je vais naturellement ajouter de multiples vérifications pour m’assurer que tout est OK.
Commençons par les outils classiques de qualité associés à l’écosystème PHP (et Javascript). On retrouve:
- La validation et la normalisation des configurations Composer,
- Des linters de code: PHP CS Fixer pour PHP et ESLint pour la partie Javascript,
- De l’analyse statique avec PHPStan,
- Des tests automatisés basés sur PHPUnit,
- Des tests de mutation avec Infection,
- Des tests d’architecture avec PHP Architecture Tester,
- Une vérification de la documentation Open API.
Pour donner quelques chiffres, voici la répartition des différents tests du projet:
| Catégorie | % PHPUnit | % tous tests |
|---|---|---|
| Unitaire PHP | 63,6 % | 62,5 % |
| Fonctionnel | 21,1 % | 20,7 % |
| Intégration | 14,7 % | 14,4 % |
| Architecture | 0,7 % | 0,7 % |
| Unitaire JS | - | 1,7 % |
| E2E | - | 0,05 % |
| Total | 100 % | 100 % |
En plus de ces derniers, de nouveaux contrôles plus spécifiques ont été ajoutés au fil des divers développements et évolutions. On retrouve donc des scripts dédiés au projet tels que:
- Une vérification du
CHANGELOG.mdqui liste toutes les modifications et permet de générer les notes de publication lors des déploiements, - Des vérifications liées aux thèmes et aux contrastes du projet dans les thèmes clair et sombre,
- Une analyse des dépendances du projet (en termes de sécurité, mais également de pertinence entre les dépendances de dev et de prod),
- Des contrôles sur la documentation et notamment la génération des tables des matières,
- Des contrôles sur les traductions (présence des traductions dans toutes les langues disponibles).
Bien entendu, l’ensemble de ces tests est exécuté au sein d’un environnement d’intégration continue qui, en plus de l’exécution des différents contrôles, va vérifier les données de type couverture de code ainsi que les scores de mutation afin de s’assurer que les tests couvrent un maximum de code et soient pertinents.