Mathieu Eveillard

50 shades of tests

50 shades of tests

Voilà un moment que j’avais envie de faire cette dissertation sur les tests. Enfin, je parle de « dissertation » quand il s’agit en fait d’un recensement. La valeur que j’espère apporter au travers de cet article repose sur la catégorisation des tests en une tripartition finalité / granularité / type d’assertion.

Partons d’un exemple : on me demande souvent comment les tests d’acceptation se positionnent dans la pyramide de tests : ma réponse est « presque partout », parce que différents types de tests peuvent jouer ce rôle, du test unitaire jusqu’au test end-to-end. C’est donc que tous les tests ne se comparent pas, tous les tests ne s’excluent pas, si bien qu’il faut en envisager différentes facettes. Ces facettes, nous les appellerons « dimensions ».

Ces dimensions (finalité / granularité / type d’assertion) sont presque indépendantes :

Bien sûr, tout est dans le « presque », car il y a des contre-exemples. Cette classification n’en reste pas moins utile à mes yeux.

C’est parti, suivez le guide !

Dimension : finalité

C’est bien sûr par là qu’il faut commencer : tous les tests n’ont pas la même finalité. Certains visent à valider la conception, d’autres le développement, d’autres à éviter les régressions etc. Voyons cela en détail :

Dimension : granularité

C’est la dimension que l’on évoque le plus souvent, au travers de la notion de pyramide de tests. Cette notion est essentielle parce qu’elle nous incite à utiliser toute l’étendue du spectre des tests dans l’objectif de tester de manière efficiente. La question sous-jacente est : « comment puis-je obtenir le maximum de sécurité en écrivant le moins de tests possibles ? »

Dimension : type d’assertion

Dernière dimension, le type d’assertion. Autrement dit « qu’est-ce que je teste », et donc « quelle sécurité ce type de test m’apporte-t-il ? »

Conclusion

Dernière remarque : tous les tests peuvent et doivent autant que possible être automatisés et joués sur la CI, à l’exception des tests utilisateurs et des tests exploratoires, pour lesquels cela n’aurait pas de sens. À cela 2 raisons :

Ensuite, savoir quels tests utiliser demande un peu d’expérience et beaucoup de pragmatisme. Le tout est d’éviter de tomber dans la loi de l’instrument, c’est-à-dire « je ne connais qu’un type de test et donc je ne fais que ça ». Votre application ne se portera pas bien s’il n’y a que des tests unitaires. Elle ne se portera pas mieux s’il n’y a que des tests end-to-end.

(*) Scott Wlaschin illustre très bien la chose au travers de cette image : « Unit tests have been compared with shining a flashlight into a dark room in search of a monster. Shine the light into the room and then into all the scary corners. It doesn’t mean the room is monster free — just that the monster isn’t standing where you’ve shined your flashlight. »

← Tous les articles