Filtrer les tests unitaires atoum exécutés
Introduction
atoum est un framework de tests unitaires, du même ordre que PHPUnit. C’est ce framework que nous avons choisi à Decitre pour créer des tests unitaires sur un projet actuellement non testé.
Problématique
Certains de nos tests ont besoin de la base pour fonctionner. C’est une très mauvaise pratique, limitée à quelques cas, mais qui permet de rajouter des tests sur des règles métiers compliquées et une première étape afin d’améliorer du code ne respectant pas certaines bonnes pratiques telles que l’injection de dépendance.
Ces tests ne sont pas executés dans notre intégration continue et à terme devraient être refactorés pour ne plus dépendre de la base et être lancés dans notre intégration continue (mais cela se fera au fur et à mesure).
Pour ne pas être exécutés dans notre intégration continue (Jenkins), ces tests étaient supprimés avant de lancer les tests atoum.
Ce n’était pas pratique de maintenir cette liste de test à supprimer. Elle pouvait dépendre des branches, et les tests pouvaient être en erreur selon les ajouts/suppressions de tests. De plus, si seulement une méthode de test avait besoin de la base, l’ensemble de la classe de test était supprimée : cela était dommage de ne pas lancer les des tests pouvant l’être.
Solution
L’utilisation de l’extension atoum-ruler va répondre à nos problématiques.
Cette extension a été écrite après discussion avec l’équipe d’atoum. J’ai tout d’abord proposé un mécanisme pour ignorer certains tags, mais celui-ci n’était pas assez générique. L’équipe d’atoum et Ivan - release manager d’atoum - ont donc proposé d’utiliser Hoa\Ruler
pour décrire les conditions.
Principe
Cette extension va ajouter une option --filter
aux options d’atoum.
Elle prendra une règle hoa ruler.
Les tests pourront être filtrés sur ces informations :
- tag
- nom de la méthode de test
- nom de la méthode testée
- namespace de la classe de test
- namespace de la classe testée
Ces filtres peuvent être mixés et il est possible d’utiliser des conditions négatives sur ceux-ci.
Exemples
Reprenons notre cas. Les tests utilisant la base de données ont été taggués database
.
Nous pouvons donc maintenant lancer tous les tests qui n’ont pas de tag “database” en utilisant cette commande :
./vendor/bin/atoum -d tests --filter 'not ("database" in tags)'
Mais il est possible d’utiliser des conditions plus complexes. Voici un exemple de la documentation de l’extension, qui va lancer tous les tests ayant le tag “needsDatabase et dont la méthode de test est “testClass1” ou tous les tests dont la méthode de test est “testClass” :
./vendor/bin/atoum --filter '("needsDatabase" in tags and method = "testClass1") or (method = "testClass")'
Conclusion
Cette extension nous a donc permis de limiter les tests executés dans notre intégration continue de façon maintenable.
Le cas présenté ici est un exemple. Vous pouvez imaginer de nombreux autres cas d’usages à l’utilisation de ces règles.