Post on 11-Nov-2014
description
© 2008 – Eric Lefevre
Fitnesse, un outil TDRFitnesse, un outil TDR
Cours du soir, 17 juin 2008
Eric Lefevre
2
ProgrammeProgramme
Pourquoi TDR?
Le premier outil Open Source: Fit
Fitnesse• Bases de la syntaxe wiki• Syntaxe avancée• Fixtures• Organisation des pages wiki• Stratégies de déploiement, Gestion de version• Plugins notables
Fitnesse vs. GreenPepper
Exercice
3
Pourquoi Test-Driven Requirements?Pourquoi Test-Driven Requirements?
Le problème d’écrire du code bon est résolu• Avec Test-Driven Development
Ecrire le bon code reste difficile• On veut coder ce que veut le client
4
Pourquoi Test-Driven Requirements?Pourquoi Test-Driven Requirements?
TDD peut être utilisé pour écrire le bon code
Ca s’appelle BDD: Behavior Driven Development• Les développeurs lisent les specs• Ils expriment dans les tests l’objectif métier• Ils codent l’implémentation qui permet de passer les tests• Eventuellement, ils génèrent de la doc à partir de ces
tests
C’est bien, mais peu intégré avec les fonctionnels
La clef de la productivité, c’est la collaboration
5
Pourquoi Test-Driven Requirements?Pourquoi Test-Driven Requirements?
Les outils TDR sont des outils de collaborationIls permettent la saisie de specs en langage naturel ET formelLes fonctionnels peuvent lire les tests à tout momentIls peuvent les rédiger (parfois avec l’aide des développeurs)Ils peuvent les maintenir
…accessoirement, les outils TDR aident à automatiser le lancement des tests
6
Scénario d’utilisation d’outil TDRScénario d’utilisation d’outil TDR
Sprint Planning:
«
En tant que conseiller financier,
je veux connaitre le taux de risque d’un client selon son âge et son salaire,
afin de lui proposer un taux d’emprunt adapté
» Demo au tableau
7
Premier outil TDR Open Source: FitPremier outil TDR Open Source: Fit
Créé par Ward Cunningham
Permet d’écrire des tests avec Word (HTML)
Moteur qui lance les tests et produit un rapport par page
8
Premier outil TDR Open Source: FitPremier outil TDR Open Source: Fit
Problèmes:• Peu pratique pour des grandes quantités de tests (pas
de factorisation de portions, pas de fonctionnalités avancées)
• Organisation des tests par répertoire• La collaboration se fait avec des envois de fichiers par
mail ou par serveur de fichier• Peu outillé (malgré des librairies complémentaires
comme FitLibrary)
9
FitnesseFitnesse
Créé par Robert C. Martin
Wrapper Fit• On peut utiliser la distribution Fit classique• On peut pointer sur les mêmes fixtures que celles
développées avec Fit
Serveur wiki
Codé en Java
Compatible avec de nombreux langages cibles
Pour certains: Fitnesse est synonyme de Fit
10
Exemple, puis comparaison avec FitExemple, puis comparaison avec Fit
11
12
Editer une page Fitnesse (classique)Editer une page Fitnesse (classique)
13
Editer une page Richnesse (plugin)Editer une page Richnesse (plugin)
14
Editer les propriétés d’une pageEditer les propriétés d’une page
15
Les bases de la syntaxe wikiLes bases de la syntaxe wiki
CamelCase pour les noms des pages• Attention aux noms de classes…• Utiliser !-AddUserFixture-! pour que le mot soit considéré
comme un mot normal et pas un lien
!1 Titre majeur, !2 Titre moyen, !3 Titre mineur
1 espace + * pour liste à bulle
2 espaces + * pour liste à bulle de 2nd niveau
1 pour liste numérotée
16
Les bases de la syntaxe wikiLes bases de la syntaxe wiki
Les pages de test commencent par ‘Test’
Les pages qui regroupent des pages de test commencent par ‘Suite’
Les noms de colonne pour lesquelles on attend un résultat finissent par () ou par ?
Les pages peuvent être hiérarchiques (recommandé)
• SuiteManagement.SuiteAddUser.TestSuccessScenario
17
Syntaxe facilitant l’écriture de testsSyntaxe facilitant l’écriture de tests
!**> […] **! Pour paragraphes « collapsables »!define pour définir des variables
• !define COLLAPSE_SETUP {true}
!path pour définir le classpath des fixturesPage SetUpTable |import| pour le package par défaut!contents pour lister les pages filles>PageFille, sous la page courantePageSoeur, à côté.PageRacine[[Mon texte][MaPageWiki]]
18
Syntaxe facilitant l’écriture de testsSyntaxe facilitant l’écriture de tests
Comparaisons• _ < 32• _ >= 99 • 38 <= _ <55
Tableau de données avec des virgules• 4,6,0
Support de types custom• String toString();• static Object parse(String s);
Mots-clefs• null, error, blank
19
Types de fixturesTypes de fixtures
Les fixtures sont les liaisons entre les tests et le code
Ce ne sont PAS des tests unitaires
Il y a 3 types standards de fixtures parents
Des plugins fournissent des fixtures supplémentaires
Il est facile (mais non recommandé) de créer ses propres types de fixtures
• Risque de créer un nouveau langage de programmation
20
ColumnFixtureColumnFixture
Pour chaque ligne, on a• Des valeurs en entrées mappées sur des variables
publiques des fixtures• Des valeurs en sortie avec ‘?’ mappées sur des méthodes
publiques• les retours des méthodes sont comparés avec les valeurs
spéficiées
21
RowFixtureRowFixture
Les lignes peuplent des objets qui sont comparés avec une collection (obtenue d’une BDD, par exemple)
22
ActionFixtureActionFixture
Simule un comportement utilisateur• ‘start’ spécifie quelle fixture utiliser• ‘enter’ passe la valeur dans la 3e colonne en paramètre à
une méthode du nom dans la 2e colonne• ‘press’ est un appel de méthode classique• ‘check’ compare le retour de la méthode dans la 2e
colonne avec la valeur dans la 3e colonne
23
ActionFixtureActionFixture
Dans un modèle MVC, on attaque le Modèle et le Contrôleur (et non la Vue)
• ‘enter’ peuple typiquement une donnée du modèle• ‘press’ est fait un appel à un service UC à travers le
Contrôleur• ‘check’ récupère une valeur dans le modèle
24
Pattern classiquePattern classique
Build – Operate – Check
C’est la base, mais voir d’autres suggestions sur le site de Fitnesse
25
DémoDémo
26
Variables dans un test FitnesseVariables dans un test Fitnesse
Tout devrait être statique…mais parfois, ça n’est pas possible
• Par exemple si on est obligé de partager les données en base avec d’autres personnes (mais il vaut mieux avoir un schéma séparé ou encore mieux, une BDD embarquée style HSQL ou H2)
• Ou si on a besoin de la date courante (mais il vaut mieux fixer une variable date partagée à une valeur arbitraire)
MaPremiereFixture
entree =id?
1 valeurPour1
2 valeurPour2
MaDeuxiemeFixture
id= Resultat?
valeurPour1 1000
valeurPour2 166.3
27
Ant & MavenAnt & Maven
<plugin><artifactId>maven-antrun-plugin</artifactId><executions><execution><id>fitnesse-tests</id><phase>integration-test</phase><goals><goal>run</goal></goals><configuration><tasks>
<property name="test_results" location="target\fitnesse" />
<mkdir dir="${test_results}" /><path id="classpath">
<fileset dir="fitnesse" includes="fitnesse.jar" /><pathelement location="target\test-classes" /><pathelement location="target\classes" />
</path><taskdef name="run-fitnesse-tests"
classname="fitnesse.ant.TestRunnerTask"classpathref="classpath" />
<run-fitnesse-testswikidirectoryrootpath="fitnesse"fitnesseport="8082"suitepage= "MaPageParent"resultsdir="${test_results}"resultshtmlpage="MaPageParent.html"resultsxmlpage="MaPageParent.xml"classpathref="classpath"failOnError="false" />
</tasks></configuration></execution></executions></plugin>
Le plugin Maven 2 pour Fitnesse semble buggé
• Problème de dépendance avec des versions trop anciennes de Fitnesse?
Je recommande plutôt d’utiliser le plugin Ant qui vient avec FitnesseCopier/coller le code ci-contre
28
Organisation des pages wikiOrganisation des pages wiki
PlanningReloaded
SuiteSaisieDesActivites
SuiteExportExcel
SuiteIntegrationCra
SuiteParJour
SuiteParSemaine
TestJourTravailleClassique
TestJourFormation
Approche naïve
29
Organisation des pages wikiOrganisation des pages wiki
PlanningReloaded
SaisieDesActivites
ParJour
ParSemaine
TestJourTravailleClassique
TestJourFormation
Specifications
Version1
SuiteIterationCourante
SuiteTestsNonRegression
TestNominal
Approche plus agile
30
Stratégies de déploiementStratégies de déploiement
Serveur classique• Machine séparée• Gestion de version propriétaire• Les développeurs peuvent pointer dessus à partir d’un Fitnesse local,
ce qui permet les tests locaux
Intégré aux sources du projet• Peu adapté à des fonctionnels non-techniques• Problèmes avec le versionnage• Rapport final peu lisible• Plus simple à automatiser par intégration continue
J’ai commencé avec l’approche ‘sources du projet’, mais à la réflexion, il vaut mieux avoir un serveur partagé
31
Gestion de versionGestion de version
Système rustique déjà intégré
Désactivable
Il reste des problèmes si on veut versionner à la mano sous un outil de gestion de conf:
• Fichiers de log• Fichiers d’erreur• Fichiers de propriétés
Certains expérimentent avec une intégration de Fitnesse avec CVS/Subversion
32
Plugins importantsPlugins importants
Fit Server pour des langages non-Java
Richnesse
Fitnesse-Selenium
FitLibrary (DoFixture)
…de nombreux autres
33
Fitnesse vs. GreenPepperFitnesse vs. GreenPepperFitnesse GreenPepper
Très simple à mettre en œuvre Complexe à mettre en œuvre (<avril 08)
Gratuit Payant (+ Confluence); va changer?
IHM rustique (sauf Richnesse?) IHM excellente
Versionnage limité Versionnage par Confluence
Support communautaire Support ‘professionnel’
Grande communauté Petite communauté
Java, .NET, C++, Delphi, Python, Ruby, Smalltalk & Perl
Java seul (pour l’instant)
Fixtures provenant de Fit & FitLibrary Fixtures plus avancées (par d’héritage)
Nombreux plugins Plugins propriétaires
Contextes d’exécution gérables avec un peu de configuration
Gestion de contextes d’exécution (?)
34
ExerciceExercice
Décompresser le livrable Fitnesse
Lancer Fitnesse• Editer run.bat• Changer le numéro de port: -p 8890
Lancer le « 2 minutes example »
Editer la page d’accueil (FrontPage)• Ajouter un lien vers un nouveau projet MonProjet
Etape suivante: écrire un test simple
35
ExerciceExercice
Créer une suite de test sous MonProjet
Créer un test simple sous la suite• Suite de Fibonacci: 0, 1, 2, 3, 5, 8, 13, 21
Lancer le test: la première case apparait en jaune• Could not find fixture: com.valtech.fitnesse.fibonacci.
FibonacciFixture
Etape suivante: établir un environnement de développement
36
ExerciceExercice
Créer un projet basique• mvn archetype:create -DgroupId=com.valtech
-DartifactId=fibonacci
Créer un projet Eclipse• Se déplacer dans le répertoire fibonacci• mvn eclipse:eclipse
Config Eclipse• Lancer Eclipse dans un workspace• Importer le projet fibonacci• Configurer M2_REPO (par défaut: C:/Documents and
Settings/<prenom>.<nom>/.m2/repository)
Ouf, vous êtes prêts à coder!
37
ExerciceExercice
Retourner à Fitnesse
Partir du nom de la fixture pour créer la classe sous Eclipse dans src/test/java
• Attention: il faut échapper le nom de la classe!!
Configurer le classpath dans la page Suite• !path ..\fibonacci\target\classes• !path ..\fibonacci\target\test-classes• Si la page Test n’est pas sous la Suite, voir Refactor
Lancer le test• Xxxx is not a fixture
38
ExerciceExercice
Configurer le pom.xml, la classe, etc. pour exécuter le test avec succès• <dependency>
<groupId>org.fitnesse</groupId>
<artifactId>fitnesse</artifactId>
<version>20070619</version>
<scope>test</scope>
</dependency>• ColumnFixture• Ne pas oublier mvn test pour tenir les .class à jour
39
ExerciceExercice
De proche en proche, selon les messages Fitnesse au lancement du test, compléter la fixture
• Les colonnes en entrée sont des noms de variables publiques
• Les colonnes de sortie (avec ‘?’) sont des noms de méthodes publiques qui retournent une valeur
Codez la vraie implémentation de la suite de Fibonacci
Ajoutez des cas de test à la page de test
Copyright noticeCopyright notice
Vous êtes libre de :• Reproduire, distribuer et communiquer cette création au public
• Modifier cette création
Selon les conditions suivantes :• Paternité. Vous devez citer le nom de l'auteur original de la manière
indiquée par l'auteur de l'oeuvre ou le titulaire des droits qui vous confère cette autorisation (mais pas d'une manière qui suggérerait qu'ils vous soutiennent ou approuvent votre utilisation de l'oeuvre).
• Rien dans ce contrat ne diminue ou ne restreint le droit moral de l'auteur ou des auteurs.
Pour plus d'infos voir : http://creativecommons.org/licenses/by/3.0/
Contact informationContact information
Présentation de Eric Lefevrecontact@ericlefevre.net
www.valtech.fr
Présentation de Eric Lefevrecontact@ericlefevre.net
www.valtech.fr
Vous pouvez modifier cette
présentation mais vous devez
citer les sources (auteur et
traducteur) quelque part dans
votre présentation.
Par exemple, incorporez cette
diapositive au début pour dire
que votre présentation provient
de ces sources.
Merci de faire pour le mieux.