vendredi 16 octobre 2009

Maîtriser par les Tests

S'il est vrai que les projets logiciels sont toujours soumis à des contraintes de temps, la réalisation des tests n'en devient pas pour autant un luxe : les tests jouent un rôle salvateur plus encore lorsque l'urgence est susceptible d'engendrer une part de chaos. Les tests unitaires sont le travail des développeurs. Ces derniers ne doivent pas les considérer comme une tâche superflus qui viendrait s'ajouter aux tâches de développement de leurs applications. Au contraire, ces tests font partie de leurs développements à part entière. Non seulement ils fournissent la garantie que leurs développements sont efficaces sur la durée, mais ils doivent aussi être livrés au même titre que les codes sources des applications. De là vient l'idée forte selon laquelle un développement opérationnel est un développement testé. Les tests unitaires font partie d'un processus rationalisé des développements logiciels.

Réaliser des tests pour une application est le seul moyen de s'assurer la maîtrise de ses développements. En effet, les tests sont là pour répondre à une question simple : "L'application remplit-elle ses objectifs en terme de fonctionnalités ?" Ces fonctionnalités sont auparavant définies par le dossier des spécifications, et chaque test mis en œuvre devra donc couvrir une fonctionnalité précise.

Une fonctionnalité correspond à un besoin de l'utilisateur final de l'application. D'abord, elle part d'un contexte, qui définit un cas d'utilisation de l'application ; elle décrit ensuite une réaction, qui doit aboutir à des résultats attendus. Un test se veut unitaire à partir du moment où il teste une seule fonctionnalité de l'application. Pour cela, un test reproduit le contexte, lance le processus associé à une fonctionnalité et vérifie l'ensemble des résultats.

Un test doit vérifier les résultats d'une application, lorsque celle-ci est stimulée en considération d'un contexte particulier. Un tel test n'est vraiment réalisable et probant que si le contexte au départ du test isole l'application du reste de son environnement. D'où parfois la nécessité de développer, pour les besoins des tests, des implémentations capables de simuler les services habituellement rendus par des processus étrangers à l'application. Une idée sous-tendue par l'isolation de l'application au sein d'un test est la définition claire des interfaces entre composants : les composants n'ont besoin d'être connus de ceux avec lesquels ils collaborent que par le biais des services qu'ils sont supposés leur rendre.