L'ensemble des méthodes de développement Agile mettent l'accent sur le test des logiciels. Cet article a pour but de présenter des outils utilisés pour générer automatiquement des tests automatiques, des outils pour écrire des tests unitaires, des outils pour écrire des tests fonctionnels et enfin des outils d'intégration continue qui ont pour but de builder en continu votre application, en lançant notamment votre batterie de tests.
Outils de génération de tests automatiques :
- Leirios édite un outil permettant de générer des tests xUnit automatiquement d'après un modèle du logiciel écrit en UML et en langage B. Il se charge d'analyser la combinatoire et de sortir des jeux de tests pertinents pour passer dans toutes les branches de l'application.
Outils pour écrire des tests unitaires :
- xUnit : le framework le plus connu pour écrire des tests unitaires. Basiquement, la classe de test hérite de TestCase, chaque méthode commençant par "test" est un test que le framework doit lancer. La vérification des résultats se fait grâce à des méthodes de la classe TestCase : assertEquals, assertTrue, failIf, failUnless, etc. Ce framework est décliné pour beaucoup de langages : jUnit (java), phpUnit (php), pyUnit (python), nUnit (C#), cppUnit(C++), httpUnit (HTML), etc...
- testNG : Il se propose comme une amélioration de xUnit (NG=Next Generation). Il permet notamment de définir des dépendances complexes entre les différents tests (un exemple basique : lancer les tests 'communications' seulement si le test 'connexion' a fonctionné).
Outils pour écrire des tests fonctionnels :
- Fit : le concept a été inventé par Ward Cunningham, le créateur du WikiWiki. Fit permet aux clients, testeurs et développeurs de savoir ce que leur logiciel doit faire, et ce qu'il fait réellement. Pour cela, les clients écrivent leurs tests sous forme de tableaux dans une page HTML en respectant le formalisme de Fit. Lorsque cette page est interprétée par Fit, les résultats produits par le logiciel sont comparés aux résultats attendus. Rouge => il y a une différence entre la spécification et les résultats produits; Vert => le logiciel produit les résultats attendus; Jaune => Exception. En pratique, les clients et les testeurs vont écrire des scénarios sous forme de tableau. Le développeur écrit une Fixture qui se charge de traduire les données du tableau en appel aux méthodes publiques du logiciel. Les tableaux sont interprétés par Fit qui appelle les méthodes de la fixture et récupère les résultats puis les compare aux résultats attendus.
- FitNesse : il s'agit d'une surcouche à Fit qui propose un Wiki pour éditer et lire les pages HTML, pour exécuter les tests, pour les organiser en suites et pour la gestion de version.
- Concordion : Son auteur est reparti des lacunes de Fit/FitNesse pour écrire Concordion. Les test s'affranchissent du format en tableau et peuvent s'intégrer au contenu HTML. La fixture utilise jUnit pour faire ses assertions. Au final, les spécifications produites sont beaucoup plus lisibles.
- Selenium : Selenium permet de faire des tests fonctionnels de site web. On écrit ses tests en Javascript et Selenium pilote un navigateur Web (Opera, Firefox ou IE, sur Linux ou Windows) pour exécuter les tests et vérifier la conformité du comportement.
- CubicTest : Surcouche à Selenium, il permet d'effectuer des vérifications à un plus haut niveau, comme l'enchaînement des pages, ou la présence de certains widgets sur la page. Il est disponible sous la forme d'un plugin Eclipse.
Outils d'intégration continue :
Généralement, tous font correctement leur travail. C'est au niveau de la facilité d'utilisation, du nombre de plugins (pour interfacer avec différents outils) et de la qualité de lecture des résultats que se fait la différence.
- CruiseControl : le premier intégrateur continu. Écrit en Java, il s'interface avec beaucoup d'outils mais sa configuration peut parfois être laborieuse.
- Hudson : facile à configurer et à utiliser, il est très bien. Il ne gère pas la consolidation des résultats des tests Fits pour le moment. Cependant il permet de définir plusieurs machines comme esclaves de construction pour se créer une ferme de compilation et de tests, en multipliant les combinaisons possibles. Par exemple, on peut lui demander de compiler un même logiciel Java avec le JRE 1.4, 1.4.1, 1.5 et 1.6 sous Linux, Windows 2000 et Windows XP. C'est lui qui se chargera de trouver les combinaisons correspondantes dans les machines disponibles et de gérer la compilation sans bloquer les esclaves les plus intéressants.
- Continuum : Il s'agit d'un projet Apache. Je ne l'ai jamais essayé mais je n'en ai entendu que du bien. Il paraît qu'il est simple à utiliser et est particulèrement adapté aux projets Java gérés avec Maven.
- Bitten : C'est un intégrateur continu simple qui s'intègre à Trac sous forme de plugin.
Si vous avez d'autres outils à faire partager, les commentaires sont là pour ça...