Daiquiri : résolution de l’année

Non ma résolution de l’année n’est pas de boire des cocktails daiquiri !

Pour cette année 2013, je me suis donné comme résolution de commencer un projet personnel open source. Je ne veux pas avoir trop d’ambition pour ce projet, l’idée est de surtout expérimenter la mise en place une usine logicielle avec les outils "cloud" d’aujourd’hui : github, cloudbees.

Pourquoi Daiquiri ? C’est le nom de la librairie utilitaire pour les tests unitaires, que je vous propose. Vous allez me dire mais il y en a déjà plein ! Oui c’est vrai mais avec cette librairie je veux proposer des solutions à des problèmes bien précis là où les autres s’arrêtent.

J’ai donc commencé une première implémétation de Daiquiri, en solutionnant un premier problème :

  • comment moquer la factory de javax.naming.InitialContext pour vos tests unitaires ?

Exemple :

package org.daiquiri.examples;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class LicenseChecker {
    static final String MAX_LICENSE = "MAX_LICENSE";
    private int currentNbUsers = 0;

    public LicenseChecker(int nbUsers) {
       currentNbUsers = nbUsers;
    }

    public boolean canAddUsers(int nbNewUsers) throws NamingException{
        Integer maxLicense = (Integer) new InitialContext().lookup(MAX_LICENSE);
        return currentNbUsers + nbNewUsers <= maxLicense;
    }
}

Les frameworks de mock classiques ne savent pas faire simplement, voici la Solution avec Daiquiri :

package org.daiquiri.examples;

import static org.daiquiri.Daiquiri.Naming.*;
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.naming.InitialContext;

public class LicenseCheckerTest {

    LicenseChecker checker = new LicenseChecker(10);

    @Test
    public void can_add_users_return_true() throws Exception{
        InitialContext mockContext = mockInitialContext();
        mockContext.bind(LicenseChecker.MAX_LICENSE, new Integer(15));

        Assert.assertTrue(checker.canAddUsers(4));
    }

    @Test
    public void can_add_users_return_false() throws Exception{
        InitialContext mockContext = mockInitialContext();
        mockContext.bind(LicenseChecker.MAX_LICENSE, new Integer(15));

        Assert.assertFalse(checker.canAddUsers(6));
    }
}

Vous pouvez trouver les sources sous mon repository github :

https://github.com/binout/daiquiri

Et un projet d’examples :

https://github.com/binout/daiquiri-examples

La site de Daiquiri toujours en utilisant github (branche gh-pages du projet) :

http://binout.github.io/daiquiri/

L’intégration continue est sous BuildHive, proposé gratuitement par Cloudbees et qui est permet en click de mettre son projet sous une version simplifiée de Jenkins adaptée pour github. (Kohsuke en avait parlé à la jenkins conférence en avril l’année dernière) :

https://buildhive.cloudbees.com/job/binout/job/daiquiri/

J’utilise un repository d’artefacts gratuit avec mon compte Cloudbees :

Et voici les lignes à mettre dans votre pom.xml, pour la version actuelle daiquiri-0.2 :

<dependency>
    <groupId>org.daiquiri</groupId>
    <artifactId>daiquiri</artifactId>
    <version>0.2</version>
    <scope>test</scope>
</dependency

<repository>
    <id>binout-cloudbees-release</id>
    <name>binout-cloudbees-release</name>
    <url>https://repository-binout.forge.cloudbees.com/release/</url>
</repository>

Et bien sûr, tout est open source sous licence Apache.

Si vous avez des idées pour les prochaines versions, n’hésitez pas à me contacter sur twitter @binout

Bon cocktail !

Publié dans Java, Test

Devoxx World : Anvers et contre tous !

Après JavaOne 2011, Devoxx France 2012, le grand chelem continue avec Devoxx World à Anvers en Belgique. Cette fois-ci, je remercie le Bordeaux JUG qui a redistribué sa place avec un tirage au sort parmi ses membres : et c’est moi l’heureux gagnant !

Cependant tout n’est pas si rose, car le chemin vers Devoxx fut un vrai chemin de croix :

  • Mardi 13 novembre 15h30 : départ de la gare de Bordeaux pour Paris
  • 17h30 : le TGV s’arrête à Poitiers, un accident a eu lieu sur la voie au niveau de Tours
  • 18h30 : le train repart mais c’est loupé pour ma correspondance pour Anvers
  • 20h : arrivée à Paris Montparnasse, je fais deux guichets pour échanger mon billet pour Anvers, en fait je dois aller à la gare du Nord
  • 20h30 : j’arrive à échanger mon billet pour un départ le lendemain matin à 6h25, mais sans garantie de place assise
  • Mercredi 14 novembre 5h40 : après avoir passé la nuit chez ma gentille belle-soeur, je prends un taxi pour être au plus tôt à la gare
  • 6h15 : le train est annoncé avec 30 min de retard de retard à cause des grèves en Belgique
  • 6h30 : le train est annulée, Devoxx s’éloigne …
  • 6h40 : le train est des-annulé, mais deux trains sont mergés en un seul, j’arrive à me caser dans une voiture pour Anvers à une place au hasard
  • 7h25 : le train démarre, l’espoir renaît !
  • 9h : à Bruxelles, le train s’arrête à nouveau… Toujours la grève, les keynotes vont commencer…
  • 10h : le train repart, les keynotes s’enchainent et je loupe le show et les annonces : la danse des robots, annonce de Devoxx UK …
  • 11h : le train arrive enfin à Anvers ….mais j’oublie ma sacoche à la descente du train, je la récupère de justesse avant que le train ne reparte vers Amsterdam, ouf…
  • 11h40 : après avoir récupéré ma chambre, je prends le tram pour le Metropolis et Devoxx commence enfin pour moi mais les keynotes sont finies…snif…

Bref, pour un premier Devoxx, c’est un bien beau bizutage ! Mais après cette première journée, ça valait le coup d’insister : le lieu est super sympa (complexe de cinéma), l’organisation est excellente, les confs de très bonne qualité : javaee7, jdk8, Arquillian …

20121114-225928.jpg

Publié dans Java

Jug Summer Camp 2012

Pour la deuxième année consécutive, j’ai pu assister à la 3ème édition du JUG Summer Camp à La Rochelle, le vendredi 14 septembre.

Et encore une fois, j’ai appris plein de choses ! Pour résumer cette journée, j’ai choisi de faire un "cloud" de logos et d’images :

Je vous laisse le loisir de "googler" les frameworks ou sujets que vous ne connaissez pas.

Par ailleurs, je tiens à féliciter l’organisation pour l’introduction de quickies et surtout de très bonne qualité, en particulier :

Encore merci à Serli et Google pour cette conférence qui permet de se re-motiver après les vacances :-)

A l’année prochaine.

Publié dans Java, JUG

Tuning JBoss 5.1.0 GA et EJB3

Il y a quelques temps, j’avais lancé une bouteille à la mer sur twitter :

En effet, dans le cadre d’une migration EJB2 => EJB3 (et oui tout le monde n’est pas encore en JavaEE 6 ….) sur JBoss 5.1.0 GA, j’ai effectué quelques tests de performance  à iso-application (avec NeoLoad ) et là … BANG …. 20 à 30 % de plus en EJB3 !  Après quelques googles, il n’y a pas de benchs connus sous JBoss qui montre cet écart donc je creuse un peu en lisant une documentation de tuning de JBoss EAP par exemple.

Dès lors, je découvre que par défaut JBoss sérialize/désérialize tous les appels EJB3 même pour des EJBs locaux, ce qui est principalement le cas dans notre application. Mais qu’une "option magique" a été ajouté suite à une feature request EJBTHREE-2110 :

org.jboss.ejb3.IsLocalInterceptor.passByRef=true

Si on l’active, la sérialization/désérialization est évitée pour les appels locaux. Super, ça va résoudre tous mes problèmes et donc je refais mes tests et … aucun changement sur les résultats. En fait en lisant de plus près la feature request, elle a été ajouté uniquement à JBoss EAP 5.1 (version avec support).

Par contre, merci à Carlo de Wolf –> qui a publié le patch à appliquer sur la version 1.3.3 de jboss-ejb3-core. Donc en reprenant les sources de jboss-ejb3-core et une petite bataille avec Maven car les repository JBoss sont un peu "deprecated" (Cf . https://community.jboss.org/en/build/blog/2011/06/01/blocking-repositoryjbossorgmaven2), j’obtiens un "jboss-ejb3-core.jar" qui peut être copié en lieu et place dans "common/lib" de JBoss.

En conclusion,

  • en patchant "jboss-ejb3-core.jar" danns mon instance JBoss
  • en activant l’option "-D=org.jboss.ejb3.IsLocalInterceptor.passByRef=true"

j’obtiens des résultats encore meilleurs en EJB3 qu’en EJB2 (5 à 10%), c’est bon la migration est OK et nous venons de faire un pas vers le présent !

Publié dans Java, Jboss

DevoxxFr : Code Story

Le deuxième jour de Devoxx, c’est le vrai départ, ça se voit avec l’affluence par rapport au premier jour des universités. Et ça commence par un grand rassemblement de tous les participants devant une scène et trois écrans géants, ça rappelle vraiment JavaOne à San Francisco (il manque juste la musique à fond). Après des keynotes plutôt intéressantes, c’est le moment de choisir son agenda, le choix n’est pas facile ….

Et bien pour commencer, je choisis : Code Story ! En effet, de ma lointaine province, j’ai un peu suivi l’initiative menée par David Gageot et Jean-Laurent de Morlhon : faire un concours pour recruter deux développeurs pour "live" coder pendant deux jours avec eux durant Devoxx. Après plusieurs tours de sélection, c’est Eric et Sébastien Lemerdy qui sont les heureux "gagnants" lors de la finale au Paris JUG.

Un peu intrigué, je décide donc d’assister au début du "live coding" : le but est de coder sur deux jours (9h-18h) une application web qui va raconter le projet en cours, en listant les commits depuis GitHub, les builds depuis Jenkins… en attribuant des badges pour le top commiteur, le commiteur le plus verbeux …  Les règles imposées sont :

  • un binôme en front qui font du live coding en expliquant à l’audience leur choix, un autre binôme en back qui lui code sans interaction avec le public, histoire d’avancer un peu plus vite
  • travail en itération d’une heure avec 5 min d’introduction, 20 min pour un 1er binôme, 20 min suivante on change les binômes, puis 10 min de conclusion avec si possible une démo
  • travail en pur TDD (même pour le javascript!)
  • software factory : trello pour le kanban, github, jenkins et sonar (grâce à David)

Et c’est parti :

Jean-Laurent : "bon on veut une appication web avec une page html"

David : "ok, bon on écrit un test qui vérifie que la page index.html doit s’afficher" -> le test est donc en erreur

Jean-Laurent : "donc il nous faut maintenant un serveur pour faire marcher le test, WebSphere ? rires …"

Davie : "je propose d’utiliser httpserver de la JDK (ndlr : solution la plus simple pour faire marcher le test), et on utilise Jersey pour fournir les resources (jax-rs de JavaEE6)"

Et ainsi de suite ….. c’est vraiment très intéressant de les voir coder et surtout réfléchir aux choix d’implémentations. En plus d’être divertissant (car il y a un jeu d’acteurs comique quand même), on apprend plein de petits trucs sur des frameworks, des outils : zombie.js, mocha, mustache, jersey, fest assert …

Je suis revenu plusieurs fois pendant les deux jours, et c’était la vraie vie d’un projet comme ce moment de solitude (environ 20 min) pour faire marche la css (test/css au lieu de text/css, la loose …). Malheureusement, je n’ai pas vu la dernière session pour la conclusion finale mais en tout cas j’ai pu voir l’application déployée sur Heroku, cliquez ici !

Si vous voulez voir les sources, elles sont dispo sous https://github.com/dgageot/CodeStoryDevoxx.

En tout cas, un grand BRAVO à ces 4 développeurs !

Publié dans DevoxxFr, Java

DevoxxFr Tools In Action

Après les universités, plusieurs sessions de "Tools In Action" sont proposées. D’une durée de 30 min, elles permettent de découvrir rapidement un framework ou un outil.

Tester une application Web avec Selenium 2, Selenium Grid et TestNG

Mathilde Lemee nous fait une démonstration d’utilisation de Selenium 2 pour automatiser du tests IHM web. Pas besoin de selenium IDE, la syntaxe est simple à écrire et on peut rapidement coder un test. Ensuite, elle conseille d’utiliser TestNG qui permet de paralléliser les tests d’IHM, qui sont souvent long surtout si on veut tester les différents navigateurs. Et si c’est encore trop long, on peut utiliser Selenium Grid qui permet de lancer les tests sur plusieurs machines virtuelles.

Chouchoutez votre code javascript

Romain Linsolas nous présente les outils et framework pour tester le javascript (oui oui c’est possible) et comment intégrer ses tests dans une intégration continue (Jenkins + Sonar). Super présentation, très concrète et en plus il fait une retranscription de son talk dans son blog !

Lien vers les slides

Réaliser des tests de charge avec Gatling

Cela fait plusieurs semaines que j’entends parler de ce framework qui monte, qui monte …. C’est l’occasion d’en savoir plus grâce à Stéphane Landelle et Romain Sertelon. Gatling est écrit en Scala et à une approche différente de ses concurrents comme JMeter. Son point fort c’est l’optimisation de la gestion des threads. Les scenarii sont écrits et variabilisé en Scala, ce qui fait un peu peur au début après une petit démo, ç a devrait aller. Il existe aussi un recoder pour enregistrer le code du scénario, mais il faut quand reprendre le code à la main après. Le lancement peut se faire en ligne de commande, et les résultats sont présentés dans un joli rapport HTML5 avec plein d’effets sympas.

Bref, même si tout ça est encore jeune, Gatling est très prometteur, il faut juste  ne pas être repoussé par un peu de Scala ;-) Pour en savoir plus, un petit tour sur le github.

Publié dans DevoxxFr, Java, Test

DevoxxFr Université : CDI mis en pratique avec travers Seam Social et Weld OSGi

Que serai une conférence sans un petit talk sur CDI ;-), je choisis donc de passer une bonne partie de l’après-midi avec Antoine Sabot-Durand et Mathieu Ancelin pour une mise en pratique de CDI dans Seam Social puis Weld OSGi.

SeamSocial

C’est un module de Seam 3 constituant un socle générique pour construire des APIs d’accès aux réseaux sociaux Twitter, Facebook, LinkedIn… Ce projet est d’ailleurs inspiré de SpringSocial (ils ont même repris les connecteurs).

Pour se connecter à un réseau social, il faut appréhender :

  • OAuth pour l’authentification (qui va sûrement devenir un standard)
  • JSON car toutes les APIs sont en REST
Pour JSON, Seam Social utilise le framework Jackson, qui propose un concept intéressant de mixin : externaliser les annotations de mapping JSON dans une autre classe et faire un binding avec le POJO resté tout clean, intéressant !
Le module reprend tous les concepts de CDI : couplage lâche, découverte dynamique de modules, …

Weld-OSGi

Cette extension de JBoss Weld (qui sera d’ailleurs bientôt intégré à Weld-core) réunit le meilleur des deux mondes : dynamique, typesafe, annotations. Elle permet de cacher la complexité d’OSGi et de l’intégrer facilement à un code utilisant déjà CDI. Il suffit alors de déployer tout ça dans un serveur hybride comme JBoss 7. La démo est assez bluffante :

J’avais déjà assisté à la même présentation au JUG Summer Camp en septembre dernier et c’est toujours aussi intéressant mais j’ai encore du mal à imaginer l’utiliser en production ….
Au final, cette université nous a permis de faire un petit rappel sur CDI et surtout de voir des cas pratiques de mise en application. Mon seul bémol, un petit manque de rythme à certain moment et pas vraiment de lien entre la partie SeamSocial et la partie Weld OSGi.

Lien 1 vers les slides

Lien 2 vers les slides

Publié dans CDI, DevoxxFr, Java
Suivre

Recevez les nouvelles publications par mail.