2 JMLPage principale du tutorielPage principale du tutoriel1 Test de logicielsTable des matières

1 Test de logiciels

1.1 Objectifs du test

Le test est la principale méthode de validation utilisée en génie logiciel. Le test d'un logiciel a pour buts :

  1. de s'assurer que ce programme est correct, c'est-à-dire conforme à ses spécifications ;

  2. de trouver les défauts de ce programme.
Concrètement, tester un logiciel consiste à l'exécuter en maîtrisant les données qui lui sont fournies en entrée et en vérifiant qu'il se comporte correctement. L'idéal serait de pouvoir faire du test exhaustif, c'est-à-dire tester toutes les entrées possibles du programme. Dans le cas général, le nombre d'entrées du programme est infini ou trop grand. Le test ne peut donc pas prouver que le programme est correct, mais seulement mettre en évidence certains défauts du programme.

Le test est une activité importante dans le développement d'un logiciel, qui prend autant de temps, sinon plus, que la programmation de ce logiciel. Le test d'un programme nécessite la conception et le développement d'un grand nombre de tests, que l'on regroupe en jeux de tests, selon les types de tests et les objectifs recherchés. L'ensemble de ces jeux de test forme une campagne de test.

1.2 Types de test

Le test unitaire de programme est un type de test qui porte sur une petite portion du programme, comme une procédure, une méthode, une classe, un petit nombre de classes ou encore un paquetage. Le test d'intégration porte sur l'intégration d'un certain nombre de classes ou paquetages ; le test système consiste à tester le programme dans son ensemble, dans les conditions « normales » d'utilisation. Le test unitaire présente les avantages suivants.

  1. Ce type de test est efficace : le test unitaire permet en effet de détecter et de corriger des erreurs à un coût beaucoup plus faible que le test du programme complet.

  2. Il permet de produire des conditions de tests qui sont difficiles à atteindre lors du fonctionnement normal du système.

  3. Il permet enfin d'obtenir un bon taux de couverture.

Le test unitaire a l'inconvénient de nécessiter l'écriture de lanceurs et de bouchons.

1.3 Critères de test

Dans le cas général, il est impossible de tester entièrement le domaine d'entrée d'un programme, car celui-ci est trop grand ou infini. On cherche donc à définir un sous-ensemble de ce domaine de taille réaliste. Un critère de test est un objectif qui permet la sélection de données pertinentes.

Test boîte noire

En test boîte noire ou fonctionnel, la sélection des données est basée sur les spécifications du programme. On cherche à vérifier que toutes les fonctionnalités du programme sont correctement implantées. Les données de test sont sélectionnées sans examiner le programme, qui est considéré comme une « boîte noire » pour laquelle on peut fournir des entrées et récupérer les sorties.

Test boîte blanche

Le test boîte blanche ou test structurel sélectionne les entrées du programme à partir de la structure du programme. Les données sont choisies de façon à exécuter différentes portions du programme.

Les tests fonctionnels et les tests structurels sont complémentaires et permettent de mettre en évidence différents défauts du programme. Les tests fonctionnels permettent principalement de détecter des défauts dus à une mauvaise compréhension des spécifications du logiciel. Les tests structurels permettent de détecter des défauts lié à la programmation.

1.4 Problème de l'oracle

Le problème de l'oracle consiste à vérifier que les sorties du programme, en fonction des entrées, sont conformes aux spécifications. Cette vérification peut être effectuée manuellement par un testeur, ce qui est long et fastidieux. On peut également automatiser une partie de ce travail en écrivant des procédures de test qui vérifient elles-mêmes que le programme fournit des résultats corrects. Ce procédé a ses limites puisqu'écrire une procédure générale qui vérifie automatiquement que, pour une entrée quelconque, la sortie est correcte, est aussi difficile que d'écrire le programme lui-même.

Dans certains cas, vérifier que pour une entrée donnée, la sortie est correcte est un problème difficile. Par exemple, si on cherche à tester un compilateur sur un programme donné, on doit montrer que le code produit est correct, ce qui est en général indécidable.

1.5 Automatisation des tests

L'exécution des tests peut être automatisée : on peut écrire des programmes qui permettent d'enchaîner l'exécution de plusieurs tests, et qui vérifient que le résultat est correct. On peut ainsi facilement faire des tests de non régression, c'est-à-dire ré-exécuter un ensemble de tests et ainsi vérifier que les fonctionnalités déjà testées continuent à produire les résultats attendus.

JUnit

JUnit (http://www.junit.org) est un ensemble de classes Java réutilisables, qui permet d'enchaîner l'exécution de tests de programmes Java. Junit permet en particulier :


2 JMLPage principale du tutorielPage principale du tutoriel1 Test de logicielsTable des matières