41
© 2008 – Eric Lefevre Fitnesse, un outil Fitnesse, un outil TDR TDR Cours du soir, 17 juin 2008 Eric Lefevre

Cours Du Soir Fitnesse à Valtech

Embed Size (px)

DESCRIPTION

Cours du soir sur Fitnesse donné mardi 17 juin à Valtech Paris

Citation preview

Page 1: Cours Du Soir Fitnesse à Valtech

© 2008 – Eric Lefevre

Fitnesse, un outil TDRFitnesse, un outil TDR

Cours du soir, 17 juin 2008

Eric Lefevre

Page 2: Cours Du Soir Fitnesse à Valtech

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

Page 3: Cours Du Soir Fitnesse à Valtech

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

Page 4: Cours Du Soir Fitnesse à Valtech

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

Page 5: Cours Du Soir Fitnesse à Valtech

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

Page 6: Cours Du Soir Fitnesse à Valtech

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

Page 7: Cours Du Soir Fitnesse à Valtech

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

Page 8: Cours Du Soir Fitnesse à Valtech

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)

Page 9: Cours Du Soir Fitnesse à Valtech

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

Page 10: Cours Du Soir Fitnesse à Valtech

10

Exemple, puis comparaison avec FitExemple, puis comparaison avec Fit

Page 11: Cours Du Soir Fitnesse à Valtech

11

Page 12: Cours Du Soir Fitnesse à Valtech

12

Editer une page Fitnesse (classique)Editer une page Fitnesse (classique)

Page 13: Cours Du Soir Fitnesse à Valtech

13

Editer une page Richnesse (plugin)Editer une page Richnesse (plugin)

Page 14: Cours Du Soir Fitnesse à Valtech

14

Editer les propriétés d’une pageEditer les propriétés d’une page

Page 15: Cours Du Soir Fitnesse à Valtech

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

Page 16: Cours Du Soir Fitnesse à Valtech

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

Page 17: Cours Du Soir Fitnesse à Valtech

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]]

Page 18: Cours Du Soir Fitnesse à Valtech

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

Page 19: Cours Du Soir Fitnesse à Valtech

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

Page 20: Cours Du Soir Fitnesse à Valtech

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

Page 21: Cours Du Soir Fitnesse à Valtech

21

RowFixtureRowFixture

Les lignes peuplent des objets qui sont comparés avec une collection (obtenue d’une BDD, par exemple)

Page 22: Cours Du Soir Fitnesse à Valtech

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

Page 23: Cours Du Soir Fitnesse à Valtech

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

Page 24: Cours Du Soir Fitnesse à Valtech

24

Pattern classiquePattern classique

Build – Operate – Check

C’est la base, mais voir d’autres suggestions sur le site de Fitnesse

Page 25: Cours Du Soir Fitnesse à Valtech

25

DémoDémo

Page 26: Cours Du Soir Fitnesse à Valtech

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

Page 27: Cours Du Soir Fitnesse à Valtech

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

Page 28: Cours Du Soir Fitnesse à Valtech

28

Organisation des pages wikiOrganisation des pages wiki

PlanningReloaded

SuiteSaisieDesActivites

SuiteExportExcel

SuiteIntegrationCra

SuiteParJour

SuiteParSemaine

TestJourTravailleClassique

TestJourFormation

Approche naïve

Page 29: Cours Du Soir Fitnesse à Valtech

29

Organisation des pages wikiOrganisation des pages wiki

PlanningReloaded

SaisieDesActivites

ParJour

ParSemaine

TestJourTravailleClassique

TestJourFormation

Specifications

Version1

SuiteIterationCourante

SuiteTestsNonRegression

TestNominal

Approche plus agile

Page 30: Cours Du Soir Fitnesse à Valtech

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é

Page 31: Cours Du Soir Fitnesse à Valtech

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

Page 32: Cours Du Soir Fitnesse à Valtech

32

Plugins importantsPlugins importants

Fit Server pour des langages non-Java

Richnesse

Fitnesse-Selenium

FitLibrary (DoFixture)

…de nombreux autres

Page 33: Cours Du Soir Fitnesse à Valtech

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 (?)

Page 34: Cours Du Soir Fitnesse à Valtech

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

Page 35: Cours Du Soir Fitnesse à Valtech

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

Page 36: Cours Du Soir Fitnesse à Valtech

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!

Page 37: Cours Du Soir Fitnesse à Valtech

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

Page 38: Cours Du Soir Fitnesse à Valtech

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

Page 39: Cours Du Soir Fitnesse à Valtech

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

Page 40: Cours Du Soir Fitnesse à Valtech

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/

Page 41: Cours Du Soir Fitnesse à Valtech

Contact informationContact information

Présentation de Eric [email protected]

www.valtech.fr

Présentation de Eric [email protected]

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.