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 :

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.

Références