créez un wiki pour vos tests fonctionnels avec fitnesse

créez un wiki pour vos tests fonctionnels avec fitnesse fitnesse, un wiki pour vos tests fonctionnels    auteur : nicolas mangin (mail: nmangin à octo.com) un wiki pour les tests? out au long d’un projet, les méthodes de développement dites "agiles" mettent un accent particulier sur la production d'un code dont la qualité et la robustesse sont démontrées par l'usage systématique de tests automatisés. cette exigence conduit à des techniques et des outils spécifiques pour la création et l'utilisation de ces tests. selon l’adage : « mieux vaux prévenir que guérir Â», l’intérêt des frameworks  de tests unitaires (xunit) dans un projet informatique n’est plus à faire. en effet, plus un bug est détecté tôt dans le cycle du développement, moins il faudra de temps et d’énergie pour le corriger. la nature même de ces tests permet d’industrialiser et d’automatiser leur exécution et obtenir ainsi, une garantie contre la régression, un code évolutif et maintenable… aujourd’hui, de plus en plus de projets informatiques franchissent le rubicon et invertissent dans les tests. dans un projet informatique, le logiciel est l’expression « software Â» des besoins exprimés par le client.  pour se prémunir contre les erreurs d’interprétation des règles fonctionnelles d’un cahier des charges, les frameworks de tests unitaires ne sont d’aucune utilité. en effet, même si votre test unitaire passe au vert dans visual studio, son utilité est nulle s’il est basé sur une mauvaise interprétation du besoin client. idem si à la fin du projet, vous livrez au client une « ferrari Â», alors qu’une « clio Â» lui aurait suffit, cela lui fera peut-être plaisir mais, vous, vous vous êtes planté. pour éviter ce genre d’erreur, il faut impliquer le client dès le début du développement et lui permettre de valider lui-même les règles fonctionnelles. pour cela, il fournit aux programmeurs des scénarios clients: les tests clients ou tests de recette. ces tests vont raconter des « histoires Â» qui illustrent chaque règle fonctionnelle et ainsi supprimer toutes les ambiguïtés ou erreurs d’interprétations. (« right code vs code right Â») il reste alors à trouver un outil  qui met la création de contenu à la portée de tous, qui facilite l'écriture collaborative de documents avec un minimum de contraintes. un outil, dont la prise en main doit être rapide par tous les acteurs d’un projet informatique : le wiki. alors pourquoi ne pas utiliser ses atouts pour la rédaction de tests fonctionnels ? les premiers à proposer un wiki dédié aux tests sont les auteurs de fitnesse. fitnesse fitnesse est un outil collaboratif dans le développement d’applications. il permet à tous les acteurs d’un projet informatique (développeurs, testeurs et clients) de se mettre d’accord sur ce que devrait faire l’application et vérifier ensuite ce que fait réellement l’application. fitnesse est composé d’un wiki qui référence les scénarios de tests, d’un moteur d’exécution pour extraire les données des tests et enfin de codes de liaison pour mettre en corrélation ces données avec le code applicatif. ce code pouvant être écrit en c#, java ou c++. l’édition et l’exécution des scénarios de tests se font via le wiki intégré. une précision : l’édition, peut se faire en mode déconnecté avec son éditeur de texte préféré (excel, word, notepad,…). les scénarios seront ensuite importés dans le wiki. fitnesse met donc l’élaboration, la documentation et l’exécution de ces scénarios à la portée de tous. fitnesse n’est pas un énième outil de test ihm : il se connecte directement aux interfaces des modules métiers via leur api. pour cela, fitnesse se base sur fit (framework for integreted test). fit est un framework qui interprète des données au format tabulaire en appelant directement les api du système à tester. on va donc pouvoir tester en profondeur l’application tout en faisant abstraction des autres modules (ihm, bases de données…). la corrélation entre les données de test et le code applicatif se fait donc par l’intermédiaire d’apis écrites par le développeur. pour l’aider dans son développement, fit (le moteur d’exécution) intègre lui aussi une api contenant un certain nombre d’interfaces (ou fixtures): columnfixture : sûrement la plus utilisée puisqu’elle permet d’accéder directement au modèle métier de l’application. on peut par exemple initialiser des objets métier qui seront utilisés par la suite. rowfixture : permet de vérifier le contenu exact d’une liste sans notion d’ordre. actionfixture : permet de simuler les actions d’un utilisateur. setfixture : hérite de la rowfixture puisqu’elle permet de vérifier le contenu exact d’une liste mais avec une notion d’ordre. subsetfixture : idem, elle hérite de la rowfixture mais permet de vérifier un sous-ensemble d’une liste. … (voir site internet /livre fit) ainsi, chaque scénario va illustrer une des règles fonctionnelles du cahier des charges. au final, on obtient donc un référentiel commun à tous les acteurs du projet. un référentiel contenant un ensemble de scénarios exécutables qui définit exhaustivement les spécifications de l’application. c'est-à-dire un « cahier des charges exécutable Â». tous cela sonne bien marketing, alors vite passons au concret ! premiers pas pour cela rien ne vaut un exemple concret de scénario. ce scénario provient d’ © octopus micro finance suite, un logiciel open-source destiné aux institutions de micro-finance, co-développé par octo technology, et oxus development network, ong française spécialisée dans la micro-finance (http://www.octopusnetwork.org). il était une fois, dans un lointain pays (au tadjikistan pour être précis) une rivière, au bord de laquelle s’élevait un moulin. ce moulin appartenait à un meunier et à son fils : benoit. benoit aimait entendre la roue du moulin tourner, il aimait sentir l’odeur du blé et de la farine fraîchement écrasée. mais un jour tout s’arrêta : un des rouages de la roue se cassa! le meunier n’ayant pas les fonds nécessaires pour faire la réparation, se rend à l’agence oxus de dushanbe. un des loan-officer présent ce jour là lui propose alors un crédit de 1000 tjs (monnaie du tadjikistan) aux conditions suivantes : 6 échéances mensuelles avec un taux d’intérêt mensuel de 3%. de plus, pour lui laisser le temps de réparer et lui permettre d’obtenir de quoi rembourser son prêt, le loan-officer lui accorde une « période de grâce Â» de 1 mois pendant laquelle il ne remboursera que des intérêts. a ce stade, on souhaite tester que l’échéancier du contrat est valide : le meunier s’engage à rembourser pendant 6 mois 200 tjs de capital et 30 tjs d’intérêts sauf le premier mois où il ne remboursera que 30 tjs d’intérêts. cette histoire peut être exprimée dans fitnesse par le code wiki suivant : create benoit's contract: - flat - 1 month grace period - 3% interest rate by period - 6 installments - begin the 01/01/2006 - default values are implicitly used for fees !|octopus.fixture.createcontract| |handle |numberofinstallments|amount|interestrate|graceperiod|startdate |installmenttype|create()| |testcontract | 6|1000 |0,03 |1 |01/01/2006|flat || is the contract scheduled correctly ? olb: outstanding loan balance !|octopus.fixture.assertschedule|testcontract| |number|date |interestrepayment|principalrepayment|installmenttotal|olb | |1 |01/02/2006 |30 |0 |30 |1000 | |2 |01/03/2006 |30 |200 |230 |1000 | |3 |03/04/2006 |30 |200 |230 |800 | |4 |02/05/2006 |30 |200 |230 |600 | |5 |01/06/2006 |30 |200 |230 |400 | |6 |03/07/2006 |30 |200 |230 |200 | quelques explications: octopus.fixture.createcontract est la classe qui permet de créer un contrat. create() est la méthode qui crée un contrat. testcontract est l'identifiant du contrat, crée.create() est la methode octopus.fixture.assertshedule est la classe qui permet de contrôler l'échéancier d'un contrat. voici comment se presente ce test dans le wiki de fitnesse: ce test vérifie l’opération de création d’un échéancier de contrat. pour cela, on va appeler les apis qui vont permettre d’une part de créer le contrat «octopus.fixture.createcontract Â» et ensuite de vérifier l’échéancier du contrat obtenu « octopus.fixture.assertschedule Â». dans cet exemple, les apis sont directement appelées par leur nom technique. on verra par la suite comment créer des alias. fitnesse reste avant tout un wiki : on peut donc enrichir les tests de commentaires, d’explications sur les règles de gestion appliquées, etc.… la fixture « createcontract Â» hérite de columnfixture. elle permet d’appeler la méthode de l’application qui va créer le contrat. public class createcontract : columnfixture { public string handle; public int numberofinstallments; public decimal amount; public double interestrate; public datetime startdate; public int graceperiod; private installmenttype installmenttype; public int create() { creditcontract contract = new creditcontract(amount, interestrate,numberofinstallments, graceperiod, startdate, installmenttype); contract.calculateinstallments(); fixturedictionnary.setvalue(handle, contract); return 1; } } quelques points importants : les attributs de la classe possèdent les mêmes noms que les éléments de la table dans le wiki : l’association est effectuée par convention de nommage. ces attributs possèdent une visibilité public. le contrat créé est stocké dans un dictionnaire (hashtable) qui permet de retrouver simplement les objets créés par un mécanisme de clé / valeur. la fixture « assertschedule » hérite de rowfixture. elle permet de vérifier l’échéancier du contrat après sa création. public class assertschedule : rowfixture { public override type gettargetclass() { return typeof(fixtureinstallments); } public override object[] query() { creditcontract contract = (creditcontract)fixturedictionnary.getvalue(args[0]); object[] list = new object[contract.installmentlist.count] ; foreach(installment installment in contract.installmentlist) { fixtureinstallments instal = new fixtureinstallments(); instal.number = installment.number; instal.date = installment.expecteddate; instal.interestrepayment = installment.interestsrepayment; instal.principalrepayment = installment.capitalrepayment; instal.installmenttotal = installment.amounthastopay; instal.olb = installment.olb; list[installment.number - 1] = instal; } return list; } } le comportement de 2 méthodes doit être redéfini : la méthode gettargetclass est surchargée pour définir la liste à retourner. la méthode query est surchargée pour définir le type d’objet que doit retourner la liste. ici nous retournons une liste échéance. récapitulons : nous avons créé la page fitnesse qui contient le scénario de notre test. le code de liaison a été développé. il ne reste plus qu’à exécuter le test. pour cela, rien de plus simple, il suffit de cliquer sur le bouton « test », situé en haut à gauche de toute page de test fitnesse. l’interprétation du résultat est sans ambiguïté : si le résultat attendu n’est pas celui que donne l’application, il est surligné en  r o u g e , sinon il est surligné en  v e r t . il existe une troisième couleur : le j a u n e, dans le cas ou la fixture n’est pas encore codée. mon scénario fitnesse passe sans encombres : mon scénario fitnesse s'exécute avec des échecs d'assertion: pour aller plus loin moyennant environ 500 lignes de fixtures, le fitnesse d’octopus réalise 18000 assertions pour 120 pages de tests. notre retour d’expérience sur octopus nous a clairement démontré que l’investissement en charge de développement, que ce soit pour le code de fixtures ou pour l’écriture du scénario, est tout à fait rentable. rendez vous compte, en mois d’une minute, j’écris le scénario dans le wiki, je clique sur le bouton « test » et je vois en live mon scénario s’exécuter avec le code de mon application! pour exécuter l’ensemble des scénarios d’octopus, il suffit de se rendre sur la page d’accueil du fitnesse (http://octopusfit.octo.com): en cliquant sur le bouton « suite », situé juste sous le logo fitnesse, on exécute l’ensemble des tests que contient le wiki en 10 minutes environ. imaginez maintenant le temps qu’il faudra à une ou plusieurs personnes pour vérifier et tester le fonctionnement de l’application à chaque modification du code du logiciel. evidement, le fitnesse d’octopus ne s’est pas fait en un jour. il s’est enrichi au fur et à mesure qu’octopus augmentait en surface fonctionnelle. si on suit le principe qui veut que ce soit le client qui écrit les scénarios, on se rend vite compte de l’importance de fitnesse dans un projet : son pouvoir de communication. l’équivoque et les trous du cahier des charges sont les conséquences d’un manque de communication entre les fonctionnels et les développeurs. et cela ne va pas aller en s’améliorant puisque l’entropie des projets informatiques ne cesse de croître. ces difficultés ont été résolues dans octopus par l’utilisation de fitnesse qui permet d’une part, de rédiger des tests de recette univoques, et d’autre part d’exécuter ces tests à l’aide de « fixtures ». au final, on obtient un ensemble de scénarios qui définissent le cahier des charges de notre application. « cahier des charges wiki » qui s’est construit de manière itérative en fonction des besoins. enfin, fitnesse permet à tous les acteurs du projet d’appréhender sereinement les évolutions futures. cependant, l’utilisation intensive de fitnesse pour octopus a mis en évidence certains défauts. par exemple, fitnesse possède son propre système de versionning qui ne se marie pas du tout avec celui utilisé pour les sources, en l’occurrence svn. l’éditeur wiki intégré, est en retrait par rapport aux standards actuels du marché (confluence, xwiki). l’interface permettant l’intégration à une usine de développement est très minimaliste. enfin, lors du développement des classes de fixtures, le système d’exceptions s'est avéré très peu explicite. il existe un autre outil, développé par pyxis technologies: greenpepper, qui semble plus prometteur. il reprend les grands principes de fitnessse, mais s'intègre à confluence tout en offrant un plus grand nombre de fonctionnalités. maintenant, la question que vous devez vous poser, n’est pas «est-il vraiment nécessaire de mettre en place un système de tests de recette automatisée ?» mais plutôt «quel outil dois-je choisir pour mettre en place mon système de tests de recette automatisée ?». auteur : nicolas mangin (octo)       © 2007 dotnetguru.org - publié le 01/07/2007

Acceuil

suivante

créez un wiki pour vos tests fonctionnels avec fitnesse  Annuaire des tests Hardware  Soins Alzheimer : Lignes directrices sur l'éthique, Les tests ...  JeuxMac.com: Toute l'actualité ludique du Mac, news, tests, previews  CFTL - Comité Français des Tests Logiciels  SCIENCES :: les tests ADN, au plus intime de l'être humain - Quid.fr  PalmAttitude.org - Les Tests  Passer des tests en ligne avec CV Conseils  Les tests psychotechniques utilisés en recrutement  SparkLife  CibleJeux - Tout gratuit pour Jeux PC : Tests Codes Astuces ...  Copines.ca - Le magazine des Québécoises - Tests de personnalité ...  Les tests de recrutement décryptés - La Tribune.fr  TT-Hardware.com - Les premiers tests de GeForce 8800 GT  Les tests et essais de scooters et motos - Dossiers Scooter System  Les tests de pièces - Dossiers Scooter System  Tests Jeux XBOX : sur Yahoo! Jeux vidéo  Mon permis bateau Tests et qcm de révision des examens permis ...  Tests du jour : Asus, HP, Toshiba et Lenovo LaptopSpirit - Toute l ...  TestNG, un autre framework de tests unitaires Java - Club d ...  Liste des tests de conformité WCAG 1.0 - UWEM 1.0  INGENIEUR TESTS ET VALIDATION H/F (H/F) - STERIA - Offre d'emploi ...  PDAddict.com :: PDA (PocketPC, Palm) :: News, Tests, Concours...  INGENIEUR TESTS ET VALIDATION H/F (H/F) - STERIA - Offre d'emploi ...  PDAddict.com :: PDA (PocketPC, Palm) :: News, Tests, Concours...  Actualité : Premiers tests réussis du canon laser de Boeing - Le ...  QI qcm logique, TEST QI gratuit Q.I test MEMOIRE IQ  Mobilesachat - Les tests  Tests, cours HTML et CSS, ressources diverses… - Covert Prestige ...  Mode, beauté, tests, psychologie, horoscope avec Marie Claire  Tests Jeux DS : sur Yahoo! Jeux vidéo  Immigration: Tests ADN: pour Amara, c'est "dégueulasse" - L'Express  DAP Technologies - Tests environnementaux  583 tests en ligne sur Pockett.net - Pockett: toute l'actualité ...  tests d'intrusion et tests de vulnérabilités  Articles, tests et dossiers  Tests de recrutement, test d'orientation professionnelle, test de ...  BeFunky - les premiers tests  Mondes Persistants, l'actu des MMOG et MMORPG » Hellgate : A l ...  2 ou 3 choses que je sais du Japon… mais pas plus! - Le Japon du ...  Tests de logique - Éditions Eyrolles  Développement de tests de diagnostic et autisme  Psychologie enfant famille - Tests gratuits et payants – Test-et ...  BioPortail Tests génétiques  Humour sur inutile.com : images sexe tests blagues pps vidéos ...  Réseau CERTA - IGC Tests  Tous les tests  Menu des tests sur les feuilles de style - clb56 : Tests en ...  clb56 - Tests en développement web - Page d'accueil.  Tests ADSL : test d'éligibilité ADSL, test de débit et de connexion  Test de débit : test de vitesse de connexion ADSL et bas-débit  Tests de niveaux en ligne - Paris - France  Dossiers, tests et comparatifs. Convertir un DVD en Divx. Encoder ...  Tests d'admission, Faculté de l'éducation permanente  MySQL AB :: MySQL 5.0 Reference Manual :: 7.1.5 Utiliser vos ...  Passion Wii Accueil - News, tests, previews, vidéos, jeux ...  Tests de langues  GenerationMP3 : le blog des baladeurs MP3  Le Flop 10 des tests INpact Virtuel  Nouveaux crash-tests de Chery par Le blog auto  Feuille d'information sur les tests génétiques