eric.lemerdy

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 15 mai 2008

ParisJUG - Productivité, Maven

productivité des développements

Productivité des développements Java

On pourrait résumer la session de Guillaume Duquesnay ainsi : la productivité des développement Java, ou comment adopter des pratiques qualité sans prononcer ce mot qui fait peur.
Une démonstration des tâches avilissantes et peu créatrices de valeur auxquelles s'est plié chaque développeur dans sa carrière au moins une fois a été exécutée par l'orateur. Il a expliqué que pas à pas, on peut améliorer la productivité de tous les membres de l'équipe. Simplement en étant à l'écoute des souffrances et des plaintes, on détecte les failles du processus de développement à corriger.
En effet, la productivité ne devrait pas être vue comme un mot taboo, mais devrait pouvoir remplacer dans la vision des managers le centre de coût que représente la qualité en une source de valeur. Là où le mot productivité dans l'industrie classique est associé à l'augmentation des cadences de travail, pour le développeur, cela rend son travail quotidien moins laborieux et plus agréable.
Du point de vue pérénité de la démarche, les procédures de qualité sont les premières pratiques à être abandonnées lorsque les contraintes projet se tendent. On peut penser au contraire que les pratiques visant a améliorer la productivité sont adoptées pour de bon.
pragmatic.jpg

Clés du succès

  • pas de religion : ne pas croire aux miracles : la solution universelle n'existe pas. Au contraire, les solutions d'amélioration de productivité doivent être adaptées au niveau de maturité de l'équipe.
  • pas de révolution : un changement progressif à petits pas est le garant de l'adoption des pratiques.
  • pas de procrastination : les tâches d'amélioration de la productivité ne doivent pas être remises à plus tard, l'expérience montre qu'on perd plus de temps à continuer une pratique improductive que de passer le temps qu'il faut à la résoudre.
J'ai retrouvé dans cette présentation une mise en pratique de nombreux conseils lus dans le livre : The Pragmatic Programmer: From Journeyman to Master. Paru il y a un peu moins de 10 ans déjà, la démarche décrite reste d'actualité et est en accord avec le discours de Guillaume.

maven à la demande

Une scéance de réponses aux questions préalablement posées par les inscrits à Arnaud Héritier.
Ce qui m'a particulièrement étonné dans l'intervention d'Arnaud fut la coloration très "commerciale" du discours. On pouvait entendre notamment les termes : Concurrence, challenge, rester sur ses acquis, niveau de service ergonomique. On a plus l'habitude d'entendre ça de la part de commerciaux ! Le cliché du développeur open-source s'est envolé immédiatement.
Il a aussi évoqué les problèmes relationnels au sein du projet. J'ai toujours supposé qu'il pouvait y avoir des tensions au sein d'une communauté Open-source. Avec maven, on est servit : un chef despotique et intransigeant (Jason van Zyl), des sociétés rivales qui se créent... Arnaud lui-même a parlé de projet à la Dallas ; ne mentionnons pas le terme "jasonification des équipes" qui m'a fait bien sourire.
filthyrichclients.jpg Il a rappelé que l'influence des entreprises est vraiment non négligeable. En effet, comment rivaliser contre des personnes qui travaillent 8h rémunérées sur le projet là où les développeurs bénévoles donnent deux heures de minuit à 2h pas très frais (attention, cliché ;-) ). Ce fut l'objet de ma question (qui m'a vallu le livre Filthy Rich Clients offert par ParisJUG et dédicacé par Chet Haase) sur ce qu'apportait au niveau personnel à Arnaud sa participation à ce projet. Pour lui, le moteur premier est la récompense d'avoir trouvé une solution satisfaisante au problème du build.
Côté infos, j'étais venu pour me renseigner sur un support du build des plug-in eclipse par Maven. Arnaud nous a renvoyé vers l'expert maison Carlos Sanchez qui a exposé ses slides durant 2h sur le sujet à la dernière eclipsecon.
Je résumerai également la rivalité des deux projets qui entrent en concurrence pour devenir le plugin de référence apportant (enfin) le support de maven dans eclipse. Notez qu'IBM a toujours mis des bâtons dans les roues à maven pour s'intégrer (à la différence d'IntelliJ ou NetBeans dans lesquels maven est très bien supporté). Ils utilisaient ant et ne voyaient pas de raisons d'en changer.
Q4em2eclipse
+ support WTP+ support WTP
pas JasonJason
+ ergonomie- peu intégré
+ support eclipse 3.3 (sous modules maven = sous projets eclipse)+ support de Nexus (indexation artefacts)
La course est féroce entre les deux projets qui sont au coude à coude. Impossible pour l'instant de les départager... Comme toujours dans ce cas là, les essayer et juger par soi même.

Une session très intéressante, encore un succès pour ParisJUG.

lundi 12 mai 2008

XP Days France 2008 : En vrac

Voici un tour d'horizon du web une semaine après le grand succès des XP Days France 2008 (ordre chronologique) :
  • Photos Flickr : tag xpday : un peu facile ce lien là, mais toujours fructueux...
    Voir aussi l'album Flickr très riche de Yannick Ameur.
  • eXtreme-Programming, 2ème édition : Emmanuel Chenu nous présente l'eXtreme Programming dans le magazine Programmez. J'en profite pour vous conseiller son blog très bien illustré.
  • XP Day France 2008 : Day 1 : Le parcours d'Anthony sur sa première journée, post bloggé au fil de la journée et dans le tram sur le chemin du retour !
  • XP Day France 2008 : Day 2 : La seconde journée d'Anthony aux XP days : un bon retour de son éxpérience pendant cette conférence.
  • Soyez aussi sérieux que des enfants qui jouent : Xavier de Labouret nous livre un billet utile pour approfondir son expérience après sa participation au leadership game (S851).
  • XP Days France 2008 part 1 - Games : Pascal Van Cauwenberghe nous rend compte (et en photos) de sa participation en tant qu'animateur sur les sessions interactives du premier jour. Au XP Game, il a joué le rôle de client pour assister Olivier Lafontan qui courait dans tous les sens pour arréter les chronos !
  • XP Days France 2008 part 2 - Interviews : Seconde partie du compte -rendu de Pascal sur la méthode "9 boxes"
  • XP Days France 2008 part 3 - Space Game : Troisième et dernier retour de Pascal sur son "Space Game". Portia et lui sont vraiment originaux et leurs sessions ont vraiment eu beaucoup de succès.
  • XPDay France: Une rétrospective : Une rétrospective illustrée d'une photo sur l'ambiance des XP Days par Portia Tung.
  • XP Day France 2008 : Jean-Michel Garnier livre sa présentation sur RSpec. C'est un post enthousiaste sur l'avenir de Ruby on Rails en France et la communauté agile.
  • Spring TDD : les ressources de la démonstration de Jean-François Hélie sur Spring TDD
  • (Feed)Back from XP Day France 2008 : Gilles Mantel nous adresse son feedback sur l'événement : un très bon résumé !
J'ai utilisé Yahoo pipes pour aggréger les blogs sur les XP days : flux XP Days france 2008.
Si j'ai oublié des retours, vous pouvez également consulter ce widget qui recherche dans les blogs : Add to Netvibes

samedi 3 mai 2008

Re: galerie SVG

Encore quelques créations Inkscape à mes heures perdues :
méthodesAgilesDevDurable src IT src coding dojo src

mardi 29 avril 2008

Découvrir Windows PowerShell

powershell.png
Petit sondage :
Qui travaille sous Microsoft Windows ?
- tout le monde ?
Qui a besoin de cmd.exe ?
- tout le monde (maven, scripting, etc.) ?
Qui trouve l'invite de commande facile à utiliser ?
- personne ?
C'est par ce rapide sondage qu'a commencé la démonstration de Cédric Rup sur la nouvelle console de Microsoft : le PowerShell.

En effet, en novembre 2006, Microsoft réagit en sortant la première version de sa nouvelle interface d'administration ultime. Il ne s'agit pas d'une interface graphique très recherchée, mais bien d'un nouvel interpréteur de commandes.

Pour télécharger la dernière version, vous devez posséder le framework .NET installé sur votre machine, et télécharger l'installation du PowerShell. Juste après cette installation, vous pourrez tester l'exécution de ces commandes bien connues :
dir
cd
ls
Surprise, les alias des commandes unix fonctionnent !
Pour avoir de l'aide en ligne sur la commande dir par exemple :
dir -?
Avec PowerShell, une commande s'appelle une commandlet. C'est l'unité de base du scripting. Il y en a 129 de base. La syntaxe est une convention : VERBE-NOM -argument param. Par exemple, la commande dir est un alias de : Get-ChildItem -Path ..

Fonctionnalités

  • Complétion sur les arguments (tab)
  • Trouver les alias d'une commande. Ex. : Get-Alias dir
  • Gestion des variables.
    Ex. :
    $dir = Get-Children
    $dir // évalue la variable
    
  • Tout est objet (là où tout est chaîne de caractère en shell unix.
    Ex. :
    $dir.* // <- utiliser la complétion pour lister les
              variables d'instance de l'objet (ses pro-
              priétés)
    $dir.getType() // on a bien affaire à un objet .NET
                      !!! avec l'accès a ses méthodes
  • Le pipe est un flux d'objets.
    Ex. :
    $dir | Get-Member // permet de lister les variables
                         d'instance de l'objet en les
                         faisant passer à travers le
                         pipe.
    // démarrer plusieurs instances de notepad
    Get-Process -Name no*
    (Get-Process -Name no*).Kill() // termine les pro-
                                      cessus notepad par
                                      appel de la mé-
                                      thode kill.
    Get-Process no* | Stop-Process // termine tous les
                                      processus notepad
                                      en passant par le
                                      pipe.
    
    Avantage : Le pipe crée un flux d'objets et n'attend pas que la liste soit totalement instanciée. Alors que l'instanciation d'une variable stocke l'objet en mémoire.
    On peut passer du code dans un pipe (inspiration perl) : c'est une méthode anonyme. Ex. :
    Get-ChildItem | Where-Object { $_.Length -gt 1Mb }
    // La variable $_ est l'object considéré lors de
       l'itération sur les résultats.
    
    On peut trier avec Sort-Object
    On peut grouper sur une propriété avec Group-Object Par exemple pour afficher les fichiers groupés par extension.
  • Il y a un certain nombre d'arguments en commun sur les objets .NET donc auquels on a naturellement accès par Power Shell:
    verbose, debug, ErrorAction (que faire en cas d'échec, voir la variable $ErrorActionPreference), ErrorVariable, WhatIf (simulation de l'éxécution, très utile), ? (aide), etc.
  • En regardant de plus près les possiblités des arguments de commande, on observe :
    • Une notion de position d'argument par défaut (si l'argument n'est pas spécifié, on présume que l'argument est daonné dans cette position dans la liste d'args)
    • Une notion d'acceptation d'argument paar le pipe...
    • Une notion de paramétrage de l'acceptaiton des wildcards.
  • La gestion des droits ext supportée par la commande : Get-Credentials. Elle permet d'acquérir une identité et de s'en servir pour l'éxécution sous une autre identité que celle du lanceur de la commande.
Pour toujours s'y retrouver, n'hésitez pas à utiliser ces commandlet "point d'entrée" : Get-Command, Get-Help, Get-Member. On peut aller plus loin en filtrant les résultats : Get-Command -Noun Item (cherche les commandes qui contiennent Item)

La puissance du Shell

On a accès à TOUT .NET. Notamment les classes du framework :
[TYPE] <- accès au type .NET
On peut donc accéder aux méthodes statiques d'une classe. Ex. :
[System.DateTime]::Now // La date actuelle.
Mais on peut aussi instancier un objet .NET. Ex:
$webclient = New-Object System.Net.Webclient // un client web !
$string = $webclient.DownloadString("http://eric.lemerdy.free.fr/dotclear/index.php?feed/atom") // on télécharge un flux rss...
$string.ToString() // ...qu'on peut afficher à l'écran !
Les variables non typées par défaut, on peut stocker un entier puis une chaîne par exemple :
$a = 12
$a.GetType()
$a = 'Eric'
$a.GetType()
Par contre, on peut forcer le typage d'une variable
[Int32]$x = 12
$x = 'YES' // Error
$x = 12 // ok
On peut donc "caster" notre chaîne xml :
[XML]$xml = $string
$xml.rss.channel.item | Select-Object title
Et accéder directement au contenu du XML !!! Ici, rss, channel et item sont des éléments (au sens XML) du contenu XML.

Extension du shell

On peut charger ses propres classes en constituant une assembly. C'est l'unité packagée de code éxécutable, l'équivalent d'un jar en java. Ex. :
[Reflexion.assembly]::loadFile(myfile)
Cette extensibilité permet de créer des API pour vos applications .NET et d'y accéder par PowerShell.
Pour ajouter des commandlet, on va constituer un snappin. C'est simplement une assembly qui contient des commandlets.
Pour l'installer : InstallUtil.exe. C'est un utilitaire également utilisé pour déclarer un service Windows.
Get-PSSnapin -Registered // les snapins installés
                   mais pas enregistrés
Add-PSSnapin  // enregistrer les snapins
On bénéficie donc des même services qu'une commandlet du package de base, comme la complétion sur les commandes par exemple.

Une uniformité fournie grâce aux providers et aux drives

Un provider est le moyen uniforme de parcourir des objets organisés hiérarchiquement. Depuis le début de l'article, on on travaille avec le provider du filesystem.
Pour connaître les providers disponibles :
Get-PSProvider // Variables d'environnement, filesystem, registre Windows, etc.
Alors que les drives sont les éléments parcourables par leur provider.
Pour connaître les drives disponibles :
Get-PSDrive // Env, C:, D:, HKLM (HKEY_LOCAL_MACHINE)
Chaque drive est donc associé à son provider. Il existe d'autre providers de la communauté : LDAP, S3 (amazon), etc.
Pour changer le drive courant :
Set-Location variable: // choisit le drive des variables
dir // liste les variables !

Instrumentation

L'instrumentation est fournie par WMI pour Windows Management Instrumentation. C'est l'équivalent de JMX sur la JVM. On peut tout savoir sur une machine : l'heure, les users loggés - en lecture/écriture ! On peut donc éditer un point de configuration du poste à partir de Powershell sans problème à condition d'avoir le niveau de droit suffisant.
Il est possible de lancer des service : Start-Service

Gestion des scripts

L'extension est : *.ps1.
Pour exécuter un script : Get-Cat | & .\out-grid.ps1
On peut appeler du Windows Forms dans powershell ce qui permet d'afficher un tableau d'objets dans une interface graphique en cinq lignes de code.
Bien-sûr, l'éxécution de scripts étant une fonctionalité convoitée par de nombreux virus, Microsoft était attendu sur l'aspect sécurité de la chose. Pour adresser ce besoin fort de sécurité, il existe la notion d' : Execution policy (politique d'éxécution).
Get-ExecutionPolicy
Set-ExecutionPolicy
Niveaux :
unrestricted : tous ok
all signed : tous signés
RemoteSigned : tous les scripts externes doivent être signés
Le niveau par défaut ne permet pas l'éxécution du tout !
Tout objet qui n'est pas "utilisé" (affectation dans une variable ou utilisé par une fonction) sort du script (console). Pour éviter ça, on redirige vers null : macommande >$null; Sinon, ça resort dans le pipe externe. Cela peut être un avantage car tout ce qui sort du pipe est traîté immédiatement par la commande suivante comme nous l'avons vu plus haut.

L'avenir

Microsoft semble prêt à ouvrir les API de ses logiciels serveurs à travers PowerShell (Exchange par exemple). Cela sera d'autant plus facilité si ces logiciels sont écris en .NET. En tant que développeurs d'applications .NET, il est aussi bénéficiable de profiter de cette ouverture qui peut faciliter la configuration et l'administration de son logiciel.
Le produit évolue. Les nouvelles fonctionnalités attendues sont : les aspects éxécution à distance, l'éxécution en parallèle, une nouvelle interface graphique, de nouveaux snappins.
Sous Linux, le projet Mono, le portage de .NET, permet à l'initiative "pwash" de ne pas repartir de zéro dans son intention de porter la ligne de commande sous Linux.
Au cours de cette petite démonstration des possibilités de la nouvelle console de Microsoft, nous avons tous été impressionés par l'expressivité de la platte-forme. Les concepts de pipe objet et d'accès à la platte-forme .NET sont des apports inconstestables à la productivité et l'efficacité du scripting.

Notons pour conclure que ce produit marque un tournant dans la démarche Microsoft qui constituait auparavant à tout doter en interfaces graphiques. Cédric nous a d'ailleurs révéllé que les développeurs de PowerShell n'avaient pas très bonne presse au sein des équipes Microsoft qui ne comprennaient pas alors le changement de stratégie de la société.
Ce changement permet à Microsoft d'élargir sa cible d'administrateurs Windows en adressant aussi les adeptes de la ligne de commande. C'est donc une attaque en règle des serveurs *nix en dotant son système d'exploitation d'une console plus puissante qu'un bash unix ?

jeudi 10 avril 2008

Le ParisJUG parle anglais avec Kirk Perperdine

C'est le "Java Champion" de la performance qui est venu se présenter devant les utilisateurs Java de Paris avant hier soir. Le moins que l'on puisse dire, c'est que Kirk Pepperdine sait de quoi il parle. A travers une présentation dynamique et pleine d'humour, il nous a fait part de sa vision sur le monde de l'IT sous le prisme de l'optimisation des programmes. Je ne vais pas paraphraser ici David, dont le billet résume parfaitement l'essence de l'intervention du Canadien.
J'ai bien aimé son explication basée sur sa théorie "The Box", sur les différences entre le développeur et le profileur de problèmes de perfo. thebox Il pense que le développeur reste trop focalisé sur la brique application (le code) tandis que le profileur aura une vision plus globale qui l'aidera à trouver la vrai source du problème. Evidemment, ça peut être la même personne mais cela demande une culture plus approfondie sur la JVM ou même le hardware. Combien de développeurs java connaissent bien leur JVM (je connais des questions pièges à l'embauche sur la JVM) ? Le point de vue de Kirk permet effectivement de prendre conscience de l'importance de la JVM et des optimisations de compilation. Sans nous demander d'aller plonger dans l'étude d'architecture physique de la machine, il nous a conseillé de toujours prendre en compte la plate-forme d'éxécution cible et de ne jamais totalement abstraire le hardware.
Pour aller plus loin :
The Box (via InfoQ)
Le post de Kirk sur la soirée Galerie photos
ParisJUG - Présentation 08/04/2008

mardi 25 mars 2008

Coding Dojo Ruby

Pourquoi ces trois mots apparemment sans lien ? Pour vous parler d'une séance dont le dojo était Valtech et l'objectif était de découvrir par la pratique le langage Ruby. La première partie de la séance fut un...

Kata Randori

Les postes de développement Ruby ont été constitués sur le vif (l'environnement Ruby pour Windows mis en place à l'aide d'un installeur). Le moins que l'on puisse dire, c'est que les configurations hétérogènes nous ont quelque peu pimenté la tâche : MacBook, PC sous XP et Linux !
Nous avons ensuite choisi le kata (i.e. l'énoncé de l'exercice) à effectuer : "Missing word in dictionnary". Un exemple vaut mieux qu'un long discours ici :

dictionnaire : ["a", "big", "white", "cat"]
entrée : "a tiny black cat"
sortie : ["tiny", "black"]

Le principe retenu fut de positionner deux rôles par poste : un développeur (à gauche) et un copilote (à droite). Il est possible d'ajouter un troisième rôle : l'observateur dont la fonction est juste d'observer... sans communiquer.
Le "Time-boxing" requiert un décalage de rôle toutes les cinq minutes. Le copilote devient développeur et le développeur devient copilote sur le poste de gauche ! On passe donc cinq minutes sur chaque poste.

coding-dojo-time-boxing.png
(src)

Bien entendu, cette mobilité contraint la méthode de développement :

coding-dojo-tdd-babysteps.png
(src)

C'était la première fois pour une majorité d'entre nous : Ruby, coding dojo, pair programming et dans une moindre mesure, TDD (Test Driven Development). Pour moi, cela a changé la façon de voir le TDD car en "solo programming", je n'appliquais pas les baby tests. J'avais toujours tendance à vouloir implémenter l'algorithme que j'avais dans la tête, et pas celui induit par les tests. Le pair force à ne pas brûler les étapes et réduit le gaspillage en implémentant le strict nécessaire aux tests.
Au final, au cours de la rétrospective qui a suivi, on a pu faire le point pour trouver de meilleures façons de travailler. Le point crucial pour terminer une implémentation correcte fut la connaissance des API du langage Ruby qui permet évidemment de raccourcir le code à écrire.
Cette forme de développement abolit de manière assez spectaculaire la propriété du code. Une chose amusante à constater est la diversité des solutions choisies de poste en poste. Cependant, le niveau de test et leur complétude est comparable car tout le monde avance en parallèle sur le sujet, ce qui est troublant et donne un côté magique... On a tellement l'habitude de trouver un code au même stade où on l'a laissé.
Après une discutions a posteriori, nous avons tout de même laissé de côté une phase préliminaire : la spécification des tests. En effet, au lieu que chaque binôme définisse incrémentalement les tests, une liste de tests ou une "spécification" peut être préparée pour savoir où on veut en venir...

Kata Préparé

coding-dojo-prepared.png
(src)

La rétrospective ayant fait remarqué notre méconnaissance de Ruby, la deuxième session fut un kata préparé effectué par celui qui connaissait le mieux le langage, Etienne Charignon. Ce fut l'occasion de choisir un sujet riche en apprentissage : le comptage du nombre de lignes de code dans un programme Java (hors commentaires et lignes vides).

Pour conclure, je dirais que le coding dojo permet de pratiquer, une très bonne façon de comprendre et d'assimiler la méthode et les concepts sous-jacents. Il est une chose d'en parler mais le vivre est encore mieux. On apprend aussi sur soi-même pendant le codage en pair. Ce n'est pas un moment où on est jugé par son pair mais bien une façon d'avancer ensemble et de tirer le meilleur parti des deux "cerveaux"... C'est un challenge à la fois amusant et instructif qui peut permettre de souder une équipe très rapidement.


Liens : les slides coding dojo.

mercredi 12 mars 2008

ParisJUG - Selenium

Pour la première rencontre du ParisJUG, Zouheir Cadi a présenté à un auditoire de bonne humeur le produit open-source Selenium.
Voici un résumé de ce que l'on a pu en retenir. Paris Jug

Selenium est à placer dans la catégorie des "web testing tools".
Il est décomposé en plusieurs modules :

  • Selenium Core[SC] : c'est un composant (HTML + Javascript) côté serveur dont le but est d'exécuter des jeux de tests d'interface sur une application web à tester sur le même serveur.
    Plusieurs instructions de test formatées dans un tableau HTML forment un jeu de test exécutable. Exemple :
    1. ouvrir l'url http://localhost/monApplication/
    2. cliquer sur le lien "contact"
    3. vérifier que la page contient un bouton "envoyer"

    Ces tests sont écrits dans la syntaxe Selenese[SE]. L'inconvénient rappelé par l'intervenant est que cela nécessite de déployer ce Framework de test sur le serveur qui héberge l'application web à tester.
  • Selenium IDE[SI] : c'est un plug-in firefox qui permet de charger et d'exécuter des jeux de test et de capturer une séquence utilisateur en "live" tout en offrant la possibilité d'éditer les instructions en intercalant des assertions de vérification. De nombreux formats d'export sont supportés, citons un format natif HTML (avec des tableaux) ou une classe java (dépendante de JUnit).
    Zouheir nous a détaillé la forme d'une instruction qui peut être une Action agissant sur un élément du DOM de la page HTML repéré à l'aide d'un Accessor. L'autre type d'instruction est l'Assertion qui permet de vérifier un postulat dans une page.
  • Selenium Remote-control[SR] : c'est un serveur java (un jar ! ) qui embarque Selenium Core et qui permet d'exécuter les jeux de test dans un langage cible plus expressif que Selenese (Java, Ruby, pyton...) en lançant un navigateur préalablement configuré avec le proxy de Selenium Remote-control. Le navigateur sera alors "contrôlé" (d'où le nom du composant) en recevant les requêtes HTTP de Selenium Remote-control.

Au delà de cette présentation en règle du Framework, la valeur ajoutée incontestable de cette session fut l'interactivité avec l'auditoire et les démonstration : Selenium IDE, Selenium Remote-control, l'intégration de Selenium à Maven[MV], le passage des tests Selenium dans Continuum[CO].
Cette partie concrète a soulevé de nombreuses questions et permis d'aborder l'intégration continue. Voilà les conseils donnés par l'intervenant :

  • Si on utilise Selenium IDE, télécharger aussi l'extension XPather[XP] qui permet de faciliter l'édition des Accessors de type XPath.
  • Attention, l'export en classe Java Junit d'un test Selenium IDE contraint l'arbre d'héritage de cette classe à l'intérieur de l'API Selenium (com.thoughtworks.selenium.SeleneseTestCase)
  • Attention, toutes les dépendances Selenium Remote-control ne sont pas hébergées par le repository central de maven, il faut configurer un repository tiers (http://maven.openqa.org)
  • Les instructions Selenese sont portées en java pour l'écriture des tests JUnit (à l'exception des assertions - déjà présentes dans JUnit)
  • Faire fonctionner Selenium Remote-control avec maven permet de l'intégrer à bas coût dans le cycle d'intégration continue, dans un serveur Continuum par exemple (démo brillante)

Les débats ont rapidement migré vers la testabilité en général : Comment bien tester une application ? Jusqu'où aller dans la précision du cas de test ? Qui doit tester l'IHM ?
Zouheir a conclu sa présentation de l'outil en rappelant que Selenium n'était pas la solution miracle pour des sites "compliqués" (ajax) en s'adressant dans ce cas à un utilisateur avancé, voire un développeur. Mais cette solution reste très efficace pour tester les interfaces des sites "simples".

Pour terminer, les réflexions suivantes sont issues de quelques discutions avec les participants.
Pourquoi mettre en place des tests unitaires IHM de non régression ?

  • parce que notre client nous fait part de régressions
  • parce que l'automatisation des tests répétitifs en fin d'itération permet de gagner du temps
Quelles bonnes pratiques pour un tel outil ?
  • Un long test Selenium est compliqué à maintenir
  • Ecrire des tests très ciblés, de faible granularité, se concentrant sur un seul enchaînement d'écran
    avantages : de proche en proche, par succession de cette suite de petits tests, on teste le cheminement global dans l'application, la maintenabilité du test est augmentée
  • Adopter un pragmatisme continu en se posant aussi souvent que possible la question : "jeter le test et le recommencer ou maintenir le script ?"
  • Comment mesurer les gains apportés par les tests IHM ? Mesurer l'évolution du nombre de régressions, du temps de validation usine (0 avec l'intégration continue ?), du temps pour faire une recette.
  • [Con$eil] Si on démontre qu'on fait gagner du temps aux testeurs/recetteurs de la maîtrise d'ouvrage au fil des itérations, on peut se faire financer l'écriture et la maintenance des tests au même titre que n'importe quelle fonctionnalité.
  • Tests et données : éviter de tester l'interface contre des données métier affichées à l'écran - d'autres Frameworks sont peut-être plus efficaces pour les tests fonctionnels (FIT[FI] ou FITNesse[FS])

Selenium est un outil efficace. Il apporte une valeur ajoutée en terme d'efficacité de l'écriture et la maintenance des tests IHM.
Cette présentation a permis aux "Java Users" présents d'avoir un aperçu exhaustif des fonctionnalités de Selenium pour pouvoir prendre les bonnes décisions dans leur choix de stratégie de test appliquée à leur projet.
Avec cette présentation, le Paris JUG a vraiment transformé sa première rencontre en un moment utile et rempli de bonne humeur.

Sinon, le selenium est un bon anti-oxidant prévenant le cancer, par contre, à forte dose, il peut être toxique. Ne pas en abuser.


[SC] : Selenium Core
[SE] : Selenese
[SI] : Selenium IDE
[SR] : Selenium Core
[MV] : Selenium + Maven = selenium-maven-plugin
[CO] : Continous web testing with Selenium, Maven and Continuum
[XP] : XPather
[FI] : FIT
[FS] : FITNesse

No (more) comment

Je viens de fermer des commentaires et trackback pour cause de spam intensif de ce blog.
Mon hébergeur Free a supprimé une table PosgreSQL qui commençait à prendre du volume et désactivé le compte de pages perso. Voyez ce bel avertissement :
Avertissement free
Suivi du message de réactivation :
Réactivation free
24 heures plus tard, le blog est de nouveau online mais l'application est un peu malade du manque de sa table de commentaires. La re-création de la table est facilitée par l'interface web d'administration de la base PostgreSQL. Ce qui n'est pas facilité, c'est le format du script DotClear qui détient le schéma de la base :
/dotclear/inc/dbschema/db-schema.php
. En effet, c'est une structure php dont il faut étudier la teneur dans le fichier :
/dotclear/inc/clearbricks/dbschema/class.dbstruct.php
, avant de créer la table.
Entre le moment où la table a été recréée et le moment où les commentaires ont été désactivés, il s'est écoulé environ 3 minutes. Ce fut assez de temps pour être remercié par 10 commentaires de spam ! C'est pourquoi je ne blâme pas Free de faire ce ménage radical lorsque les bases gonflent. Ils auraient aussi pu me radier de leur service d'hébergement gratuit...

vendredi 15 février 2008

Du code temporaire qui devient définitif

Cette réflexion vient d'un retour qu'on m'a fait sur un programme écrit pour un client. La consultante fonctionnelle qui connaît bien les tables relationnelles de son produit me demande les logs des requêtes SQL éxécutées par mon programme.

Le problème

Le log transmis, elle observe une curiosité du type : select * from table where table.col1 = 'x' (...) and table.col1 = 'x' (...)
La requête est valide mais cela m'intrigue aussi. Comment en arrive-t-on à écrire un tel ordre et comment éviter que cela ne se reproduise ?
La bonne nouvelle c'est que grâce à la gestion de configuration, la tracabilité est assurée. La modification incriminée est apparue entre le 30/07/2007 14:00 (version 1.2) et le 01/08/2007 11:55 (version 1.3) :
v1.2
select * from table2 where /* table.col1 = 'x' and*/ (...) and table2.col1 = 'x' (...)
remplacement de table2 par table
select * from table where /* table.col1 = 'x' and*/ (...) and table.col1 = 'x' (...)
v1.3 : suppression du commentaite
select * from table where table.col1 = 'x' and (...) and table.col1 = 'x' (...)

Remonter aux origines

C’était l’époque où il y avait une incertitude sur la table source. J’ai donc introduit un commentaire dans la requête SQL sur la première condition (pour me souvenir qu’il serait probable qu'à terme, on filtrerait sur cette table source) avant de rajouter une autre condition que je considérais comme non définitive sur la table2… Après précision du nom de la table à requêter, j'ai supprimé le commentaire sur ma condition 1 sans relire la requête en entier après l’effacement de ces commentaires dans le SQL. Voilà pourquoi il existe aujourd’hui les deux conditions dans la même requête.

Leçons à retenir

  • La gestion de configuration permet de tracer très efficacement les modifications dans le code. Je n’aurais donc pas du mettre la condition en commentaire mais bel et bien l’effacer ! Seulement un commentaire dans le code est plus « visible » qu’une historisation de version. Or, le problème avait vocation à être résolu un jour. Dans ce cas, le commentaire n’agit pas comme une mémoire mais comme un marqueur de problème à résoudre. Et lorsqu’on agit mécaniquement (remplacement en masse), que les tests unitaires passent et que le programme se comporte correctement après résolution, on peut introduire ce genre de bizarerie !
    Typer son commentaire (de type TODO dans eclipse par exemple) est donc préférable car cela permet de :
    • Marquer visuellement dans le code qu’il y a un problème à résoudre
    • Retrouver, le cas échéant, la version historisée à l’aide de l'historisation car ce n'est plus du code en commentaire mais une explication du problème. Si c'est une autre personne qui dépile les tâches TODO, elle saura quoi faire alors que devant un code en commentaire, on ne sait pas quoi faire. Moi, en général, je supprime ce code...
  • Appliquer un principe d'ergonomie : rapprocher visuellement ce qui est lié, car du code est destiné à être relu, c'est donc aussi une représentation graphique ! En effet, pourquoi la seconde condition a-t-elle été placée si loin de la première alors que je savais que la seconde était temporaire et devait disparaître ?
  • Ecrire un commentaire pour se souvenir qu'il faudra changer la condition est du gaspillage. Mon programme n'en avait pas besoin pour fonctionner, je devais donc le supprimer. Le refactoring qui allait suivre serait donc plus simple et donc moins soumis à l'erreur.

mardi 12 février 2008

Isometric icon set

isometricIconSet.png Inkscape 0.46 is nearly there ! That is just the occasion for me to test the so-long-waited isometric grid feature that snap your points like if you were an architect with a natural born talent to draw in axonometric coordinates...
The other feature is the 3D-boxing. I personnaly do prefer isometric than perspective for vector icons...
My last SVG contributions :

- page 3 de 10 -