Cours Du Soir Fitnesse à Valtech
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Cours Du Soir Fitnesse à Valtech

  • 6,007 views
Uploaded on

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,007
On Slideshare
5,871
From Embeds
136
Number of Embeds
3

Actions

Shares
Downloads
132
Comments
0
Likes
1

Embeds 136

http://blog.valtech.fr 118
http://www.slideshare.net 16
http://www.slideee.com 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Fitnesse, un outil TDR Cours du soir, 17 juin 2008 Eric Lefevre
  • 2. Programme
    • 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?
    • 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?
    • 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?
    • Les outils TDR sont des outils de collaboration
    • Ils permettent la saisie de specs en langage naturel ET formel
    • Les fonctionnels peuvent lire les tests à tout moment
    • Ils 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 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: 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: 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. Fitnesse
    • 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 Fit
  • 11.  
  • 12. Editer une page Fitnesse (classique)
  • 13. Editer une page Richnesse (plugin)
  • 14. Editer les propriétés d’une page
  • 15. Les 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 2 nd niveau
    • 1 pour liste numérotée
  • 16. Les 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 tests
    • !**> […] **! Pour paragraphes « collapsables »
    • !define pour définir des variables
      • !define COLLAPSE_SETUP {true}
    • !path pour définir le classpath des fixtures
    • Page SetUp
    • Table |import| pour le package par défaut
    • !contents pour lister les pages filles
    • >PageFille, sous la page courante
    • PageSoeur, à côté
    • .PageRacine
    • [[Mon texte][MaPageWiki]]
  • 18. Syntaxe 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 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. ColumnFixture
    • 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. RowFixture
    • Les lignes peuplent des objets qui sont comparés avec une collection (obtenue d’une BDD, par exemple)
  • 22. ActionFixture
    • Simule un comportement utilisateur
      • ‘ start’ spécifie quelle fixture utiliser
      • ‘ enter’ passe la valeur dans la 3 e colonne en paramètre à une méthode du nom dans la 2 e colonne
      • ‘ press’ est un appel de méthode classique
      • ‘ check’ compare le retour de la méthode dans la 2 e colonne avec la valeur dans la 3 e colonne
  • 23. ActionFixture
    • 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 classique
    • Build – Operate – Check
    • C’est la base, mais voir d’autres suggestions sur le site de Fitnesse
  • 25. Démo
  • 26. Variables 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)
    valeurPour2 2 valeurPour1 1 =id? entree MaPremiereFixture 166.3 valeurPour2 1000 valeurPour1 Resultat? id= MaDeuxiemeFixture
  • 27. Ant & 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=&quot;test_results&quot; location=&quot;targetfitnesse&quot; />
    • <mkdir dir=&quot;${test_results}&quot; />
    • <path id=&quot;classpath&quot;>
    • <fileset dir=&quot;fitnesse&quot; includes=&quot;fitnesse.jar&quot; />
    • <pathelement location=&quot;target est-classes&quot; />
    • <pathelement location=&quot;targetclasses&quot; />
    • </path>
    • <taskdef name=&quot;run-fitnesse-tests&quot;
    • classname=&quot;fitnesse.ant.TestRunnerTask&quot;
    • classpathref=&quot;classpath&quot; />
    • <run-fitnesse-tests
    • wikidirectoryrootpath=&quot;fitnesse&quot;
    • fitnesseport=&quot;8082&quot;
    • suitepage= &quot;MaPageParent&quot;
    • resultsdir=&quot;${test_results}&quot;
    • resultshtmlpage=&quot;MaPageParent.html&quot;
    • resultsxmlpage=&quot;MaPageParent.xml&quot;
    • classpathref=&quot;classpath&quot;
    • failOnError=&quot;false&quot; />
    • </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 Fitnesse
    • Copier/coller le code ci-contre
  • 28. Organisation des pages wiki Approche naïve PlanningReloaded SuiteSaisieDesActivites SuiteExportExcel SuiteIntegrationCra SuiteParJour SuiteParSemaine TestJourTravailleClassique TestJourFormation
  • 29. Organisation des pages wiki Approche plus agile PlanningReloaded SaisieDesActivites ParJour ParSemaine TestJourTravailleClassique TestJourFormation Specifications Version1 SuiteIterationCourante SuiteTestsNonRegression TestNominal
  • 30. Straté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 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 importants
    • Fit Server pour des langages non-Java
    • Richnesse
    • Fitnesse-Selenium
    • FitLibrary (DoFixture)
    • … de nombreux autres
  • 33. Fitnesse vs. GreenPepper Gestion de contextes d’exécution (?) Contextes d’exécution gérables avec un peu de configuration Plugins propriétaires Nombreux plugins Fixtures plus avancées (par d’héritage) Fixtures provenant de Fit & FitLibrary Java seul (pour l’instant) Java, .NET, C++, Delphi, Python, Ruby, Smalltalk & Perl Petite communauté Grande communauté Support ‘professionnel’ Support communautaire Versionnage par Confluence Versionnage limité IHM excellente IHM rustique (sauf Richnesse?) Payant (+ Confluence); va changer? Gratuit Complexe à mettre en œuvre (<avril 08) Très simple à mettre en œuvre GreenPepper Fitnesse
  • 34. Exercice
    • 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. Exercice
    • 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. Exercice
    • 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. Exercice
    • 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 argetclasses
      • !path ..fibonacci arget est-classes
      • Si la page Test n’est pas sous la Suite, voir Refactor
    • Lancer le test
      • Xxxx is not a fixture
  • 38. Exercice
    • 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. Exercice
    • 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
  • 40. Copyright 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/
  • 41. Contact information Présentation de Eric Lefevre [email_address] 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.