Depuis que je fais de l’informatique, lorsque l’on parle de tests automatisés, je remarque que tout le monde a une définition différente de ce qu’est un test. Qu’ils soient dits unitaires, d’intégration, fonctionnels ou de bout en bout, je n’ai quasiment jamais vu deux équipes en avoir la même définition. J’aimerais ici donner une définition, la définition que j’adopte dorénavant et qui est actuellement partagée par les équipes avec lesquelles je travaille.
Les tests unitaires sont aujourd’hui considérés comme le Graal par les développeurs. Ce sont les tests qu’il faut absolument écrire. Considérés comme simples à écrire et rapides à s’exécuter, ils doivent permettre de s’assurer du bon fonctionnement d’une partie d’un projet. On les retrouve à la base de la fameuse pyramide des tests:

Un test unitaire est souvent défini comme une procédure automatisée qui vérifie le bon fonctionnement d’une unité de code. L’unité de code présente la plus petite partie testable d’une application. Cela est, la plupart du temps, une fonction, une méthode ou une classe. L’objectif étant de vérifier le comportement de chaque composant indépendamment du reste du système.
De mon point de vue et d’expérience, la définition précédente est ambigüe. Personne n’arrive réellement à définir ce qu’est une unité de code. Tout le monde donne sa propre définition et le résultat est de voir des débats interminables au sein des équipes de développeurs.
Parmi les questions que l’on se pose et qui ne trouvent pas de réponse universelle, doit-on bouchonner (mocker) tout élément extérieur au code que l’on teste ? Un test peut-il être considéré comme unitaire s’il utilise une instance d’une autre classe ? Cette question pourtant simple ne trouve pas de réponse unniverselle. Certains défendront l’idée qu’il faut isoler au maximum le code testé. D’autres pourront considérer qu’on peut voir l’ensemble comme une unité de code.
Dans les équipes avec lesquelles je travaille, nous nous sommes accordés sur une définition n’ayant que très peu d’ambigüité et qui mets l’ensemble des développeurs d’accord. Cette définition n’est pas unique et je l’ai également rencontré dans la formation de Charles DESNEUF sur les tests automatisés. Ainsi, actuellement, je considére qu’un test est unitaire s’il respecte les conditions suivantes:
- s’il ne communique pas avec la base de données,
- n’interagit pas avec le réseau,
- ne touche pas au système de fichier,
- peut s’exécuter en même temps que n’importe quel autre test unitaire,
- ne nécessite pas de modification de l’environnement pour fonctionner.