Month: October 2008

MBunit et Resharper 4.1

Posted by – October 31, 2008

R# vous donne des conseils pour refactorer votre code. Il contient également un test runner mais uniquement pour NUnit. Un projet maintenu sur Google code permet de lancer MbUnit à partir de R#, les dernières sources sont pour la version 4.0 de R#. En naviguant un peu j’ai trouvé l’astuce pour le faire fonctionner sous R# 4.1, une ligne a été ajoutée dans le fichier install.bat, l’archive est disponible en annexe.

Après l’installation, vous aurez accès, dès détection d’un test, à une pastille verte pour lancer le runner

ResharperMbunit

Les test lancés, on a droit à une très belle fenêtre avec l’ensemble des tests, ainsi que leur état (Ok, KO, ignoré).

Encore plus fort, vous utilisez NHibernate, il vous mettra les requêtes construites par l’ORM, magique.

ResharperMbunitNHibernate

Read It Later

Posted by – October 30, 2008

On connaît ReadItLater, une extension Firefox qui permet de marquer une page pour se rappeler de la lire plus tard. L’éditeur sort une nouvelle version de son fameux plug-in avec une intégration Google Reader.

Grâce à cette nouvelle fonctionnalité, vous pourrez directement à partir de GR, marquer un billet à lire plus tard. Associé à l’extension AideRSS qui s’intégre également dans GR, l’agrégateur devient alors un must du genre.

RIL

Parmi les autres fonctionnalités très utiles, nous trouverons :

  • la possibilité de synchroniser les liens bookmarkés entre vos postes (à la maison et au bureau par exemple),
  • encore mieux : vous êtes l’heureux nouveau possesseur d’un EeePC like, le MSI Wind U100 le bien nommé et vous aimeriez bien trouver le temps de lire tous les billets qui s’empilent. ReadItLater a un mode de lecture hors connexion : il téléchargera la page pour vous afin que vous puissiez la lire off line. Vous aurez alors tout à loisir de pouvoir enfin lire vos billets pendant le transport avec votre MSI Wind bien entendu.

RIL

Cela se passe ici.

Ego…portrait 01 informatique

Posted by – October 27, 2008

Ma vie, mon oeuvre

Il y a 3 semaines 1/2, une journaliste de 01 informatique me contactait pour me proposer une entrevue pour la rubrique Perso, rencontre du journal papier. Intrigué et attiré par l’expérience, je me suis dit ok, pourquoi pas, allons explorer les coulisses de ce type d’articles, que je suis amené à lire régulièrement.

Comme on m’a déjà posé la question, alors pourquoi votre serviteur ? Suis-je un bloggueur influent ? pas du tout non – Suis-je un guru .NET ou du Web [1,2,3, n], non plus, pas plus que la moyenne. Tout simplement parce que j’ai un blog, et un peu de hasard associé à un bon référencement sur les mots design patterns dans le moteur de recherche de Blogs Google ont fait ressortir mon blog. Marie JUNG, que je remercie pour son professionnalisme, l’a alors trouvé intéressant et m’a contacté, l’interview sera dans l’édition de jeudi.

Errata

Quelques coquilles se sont glissées dans les réponses faites (qui sont en réalité un ensemble de phrases prises, pas forcément dans l’ordre, au cours de l’entrevue), notamment dans le 1er paragraphe , dont une qui s’avère être une erreur grossière, je me permets donc de corriger les plus importantes par le biais de ce billet.

Par ailleurs, des communautés se créent autour du framework de Microsoft, tel Alt.Net, et évitent de n’utiliser que du .Net.

ce qui n’a pas vraiment de sens, il faut bien entendu lire

[...] tel Alt.NET, et évitent de n’utiliser que des librairies/frameworks Microsoft.

Pour rappel, Alt.NET (voir les principes fondateurs) promeut non seulement des librairies / frameworks Opensource (NHibernate, RhinoMocks, MbUnit, Castle Windsor/Spring, …), mais prône également une ouverture vers d’autres technologies ou méthodes, du moment que cela améliore la conception du logiciel (approche pragmatique donc). Ce type de mouvement est apparu car Microsoft jusqu’à il y a 1 ou 2 ans, ne proposait pas clairement des solutions (hormis le DataSet par exemple, c’est extrême, je sais) pour améliorer le développement. Depuis, issus certainement du fruit d’une écoute de la part de MS, des frameworks sortent des laboratoires MS, Entity FrameworkMEF, Unity ou ASP.NET MVC (si MS propose lui-même des alternatives à ASP.NET Web Forms, où va-t-on !), pour ne citer qu’eux. Une liste non exhaustive des comparaisons Alt.NET / MS.

[...] tel NHibernate qui simplifie les requêtes MySQL

pour résumer (la problématique des ORM est bien plus compliquée), la phrase est à remplacer par,

[...] tel NHibernate qui simplifie les requêtes SQL

nous n’utilisons pas MySQL, mais bel et bien SQL Server.

Rétrospective de cette expérience

Expérience positive me concernant, ce fût une opportunité d’approcher un peu ce monde inconnu pour moi, et d’observer la conception d’un article et les divers intervenants pour ce dernier : la journaliste, le service iconographie, la photographe.

Au sujet de la photo, en haut du billet, c’est un avis tout personnel, on pourrait croire à une photo pour les bouquins Arlequin, vous savez, un peu Amour, Gloire et Beauté, ma réputation de méchant en prend un coup, je vais devoir sévir. Non, plus sérieusement, je ne suis pas fan des photos où le sujet ne regarde pas l’objectif (mais peut être que je ne suis pas très photogénique, je peux le concevoir), cela fait trop mise en scène, même si au-delà du point de vue, elle reste de qualité. J’ai pu, pendant la séance de photos, glaner quelques conseils d’une pro, et ça, c’est plutôt appréciable et positif.

Enfin, une certaine appréhension malgré tout. Dans une entrevue d’1h30, il reste un risque d’incompréhension de la part de la journaliste, ou des coquilles plus ou moins grandes lors de la rédaction de l’article, cela concerne l’image qu’on expose et des risques afférents. D’autant plus, que nous n’avons pas droit de regard sur le résultat avant sa diffusion. Règle que je comprend et respecte, cela contribue à l’indépendance de la presse (cela démarre à ce simple niveau), on accorde alors une sacré dose de confiance au journaliste. Mais le résultat est assez positif, résumer en une page, beaucoup de propos, en gardant une idée générale, le journalisme est bien beau métier.

01 informatique sort le 30 octobre, je mets tout de même un lien en annexe vers le PDF du portrait qui sera dans cette édition. Voilà, ce fût ma maigre contribution à .NET, Alt.NET et au Web. Et dire qu’avec cette nouvelle notoriété, j’allais postuler à la Star Ac’, c’est loupé, une fois de plus…

Photoshop CS3 in action

Posted by – October 25, 2008

Si lecteur, tu es un amateur de photographie et que tu souhaites sublimer ton talent afin d’espérer apparaitre un jour sur Flickriver, alors essaie cette sublime collection d’effets en tout genre : Ultimate collection of Photoshop Actions

Valtech days 2008

Posted by – October 21, 2008

Un résumé de la première journée de cette édition 2008 sur les thèmes de l’agilité, l’industrialisation, l’architectures et l’e-Business/Web2. Un bref compte-rendu des quelques sessions auxquelles j’ai pu assister.

Dans l’ensemble, rien de bien nouveau sous les tropiques, les thèmes restent présents depuis 2007. Mais pourquoi pas, si cela peut influencer les décideurs / DSI sur l’intérêt de l’agilité, industrialisation & consorts dans nos projets.

Mes choix se sont portés naturellement vers l’agilité, le code & les tests, et un peu de Web 2 (ou 3).

More

Grève de Blogasty, appel aux Digg-like

Posted by – October 19, 2008

En ce dimanche, Blogasty en appelle à la grève des digg-likes car il y en a marre des votes d’intérêts et de complaisances. Je comprends tout à fait cet appel de Christophe. Un vote stratégique ne sert à rien, ni des amis , personnellement, cela ne me fera pas plus voter pour un autre blogueur.

Blogasty on strike

…faut dire qu’en ce dimanche soir, Nico et Georges se rencontrent pour discuter milliards et crise, donc, forcément, ce type de nouvelle en devient cruciale…;)

Tests in progress

Posted by – October 19, 2008

Préambule

Nous sommes en train de reprendre un module pour préparer une bascule prochaine. Ce module concerne une gestion de listes de diffusion (de discussions, distributions, newsletters, …) qui contient des actions simples : création ou suppression d’une liste, ajout ou suppression d’un abonnement.

C’est l’occasion d’ implémenter des tests sur ce module. Pas tout à fait TDD dans le principe, mais cela aura au moins le mérite de commencer à prendre la main sur les frameworks et la méthode d’implémentation.

On va procéder par étapes, en commençant petit, il est toujours préférable d’être raisonnable dans ses objectifs, think big, start small disait mon grand-père agile.

Dans l’écriture de ces tests, il va s’agir de vérifier les entrées (chaînes de caractères) passées aux différentes méthodes, à savoir que le nom de la liste, et l’email de l’abonné soient bien formés (en gros que les regexp qui vérifient ces entrées fonctionnent).

On tentera (presque) de respecter le modèle du triptyque RED-GREEN-REFACTOR, sauf que dans notre cas, il existe du code :

  • écriture d’un test, le faire planter, le résultat du test runner doit être au rouge,
  • faire passer le test au vert,
  • réécrire le code le cas échéant

Outils

Le framework de tests utilisé est MbUnit, et le runner un add-in VStudio TestDriven.NET. Une version d’évaluation de ReSharper est également installée pour accélérer les ajustements de code.

Dès que je peux, je tenterai également ce projet qui me parait fort intéressant : mbunit-R#.

Mise en place

Un peu de théorie

Le module s’appelle ListManager, notre projet de tests se nommera donc selon la convention ListManager.Tests. Les noms des méthodes de tests sont écrites selon le format suivant : ”NomMethodManager_ResultatAttendu_ScenariodeTest’.

Les méthodes de notre Manager à tester sont de l’ordre de 4, on s’arrêtera à la 1ère pour notre exemple :

  • CreateList(list) : créer une liste
  • DeleteList(list) : supprimer une liste
  • Subscribe(list, email) : abonner à une liste un email
  • Unsubscribe(list, email) : désabonner d’une liste un email

Sur notre existant, chaque méthode ne renvoie que des exceptions, notamment sur la vérification de la validité des entrées, ici list et email. Des expressions régulières sont utilisées pour tester le format de ces 2 paramètres. En gros que les caractères du type [a-z0-9-_.] sont acceptés. Chaque méthode renvoie une exception ArgumentException s’il s’avère que le format des chaînes est erroné.

Le Manager peut être utilisé avec 2 fournisseurs possibles, qui représentent 2 moteurs de listes de diffusion (SYMPA ou LYRIS). L’un ou l’autre est sélectionné selon la stratégie adoptée. Les tests de différents cas d’entrées sont à dérouler bien entendu sur les 2 providers.

La base posée, passons à l’écriture de nos tests.

Passons à la pratique

Testons CreateList(). Le résultat attendu est une exception ArgumentException sur des chaînes qui ne respectent pas le format attendu. Le test doit être au vert si la méthode renvoie donc bien une exception sur une mauvaise entrée, par exemple :

CreateList(“éléphant”) doit renvoyer une erreur. Le code pour tester que ces cas renverront bien un exception pour les 2 providers, l’attribut [ExpectedArgumentException] de MbUnit permet de tester l’exception attendue :

  1. using ListManagerConnector;
  2. using MbUnit.Framework;
  3.  
  4. namespace ListManager.Tests
  5. {
  6. [TestFixture]
  7. public class ListManagerTests
  8. {
  9. [Test]
  10. [ExpectedArgumentException]
  11. public void CreateList_onSympa_ShouldThrow_IfNameOfList_IsNotWellFormed()
  12. {
  13. var lm = AbstractFactory.Factory("SYMPA").ListManagerControler;
  14. lm.CreateList("éléphant");
  15. }
  16.  
  17. [Test]
  18. [ExpectedArgumentException]
  19. public void CreateList_onLyris_ShouldThrow_IfNameOfList_IsNotWellFormed()
  20. {
  21. var lm = AbstractFactory.Factory("LYRIS").ListManagerControler;
  22. lm.CreateList("éléphant");
  23. }
  24. }
  25. }

Ce premier est pas mal, mais rien que pour éléphant, il nous faut 2 méthodes de tests. Pour chaque motif à tester, 2 méthodes supplémentaires, ce qui devient vite rébarbatif et donc peu motivant. Pour améliorer cela, MbUnit fournit la possibilité d’injecter des jeux de tests dans les méthodes (dans le même principe que des tests fonctionnels, voir FitNesse). Pour cela, utilisons les attributs [RowTest] (qui remplace l’attribut de base [Test]) et [Row] pour dérouler les cas intéressants et ce, sur les 2 providers.

Testons les motifs éléphant, l’éléphant, et certains autres cas sur les providers nommés SYMPA et LYRIS. Le paramètre strategy permet de tester chaque méthode sur les 2 providers :

  1. using ListManagerConnector;
  2. using MbUnit.Framework;
  3.  
  4. namespace ListManager.Tests
  5. {
  6. [TestFixture]
  7. public class ListManagerTests
  8. {
  9. [RowTest]
  10. [Row("malist@cc", "SYMPA")]
  11. [Row("malist@dummy.fr", "SYMPA")]
  12. [Row("", "SYMPA")]
  13. [Row("éléphant", "SYMPA")]
  14. [Row("l'elephant", "SYMPA")]
  15.  
  16. [Row("malist@lyris.fr", "LYRIS")]
  17. [Row("malist@fr", "LYRIS")]
  18. [Row("", "LYRIS")]
  19. [Row("éléphant", "LYRIS")]
  20. [Row("l'elephant", "LYRIS")]
  21. [ExpectedArgumentException]
  22. public void CreateList_ShouldThrow_IfNameOfList_IsNotWellFormed(string listname, string strategy)
  23. {
  24. var lm = AbstractFactory.Factory(strategy).ListManagerControler;
  25. lm.CreateList(listname);
  26. }
  27. }
  28. }

et voilà, comment en une méthode implémenter un jeu de 10 tests. Jouons la méthode avec TestDriven sous VStudio 2008 et le runner de MbUnit. On voit que MbUnit déroule chaque cas (éléphant, l’éléphant, ..) sur la même méthode.

Sous Visual Studio :

MbUnit

En lançant le runner de MbUnit :

MbUnit

Si nous avions introduit une donnée correcte, un des tests aurait été dans l’état rouge ou FAILURE, par exemple le test suivant doit échouer :

  1. [Row("od", "SYMPA")]

MbUnit

à chaque nouvelle écriture d’une méthode de test, on commencera par la faire échouer de cette façon.

Rétrospective

Ces premiers tests répondent à tout ou partie à notre besoin : vérifier que les entrées de nos méthodes sont bien formées.

Quelques retours sur ces 1ers tests :

  • dans notre cas, il a fallu que les 2 serveurs de listes soient en fonction, sans compter la configuration ad-hoc nécessaire. Aussi, il aurait été bénéfique que les 2 providers soient injectés dans le manager, afin de pouvoir les simuler lors des tests, part des Stubs / Mocks par exemple. Ici, on part du principe que nos serveurs fonctionnent et rendent le service attendu. Bien sûr, si l’objectif était de les tester alors on déploierait les tests nécessaires, même si cela concerne plus de l’intégration que des tests unitaires,
  • on comprend mieux la nécessité d’une usine d’intégration continue. Je m’imagine mal exécuter des centaines de tests à chaque fois sur mon IDE. L’usine peut apporter une solution à cette question.
  • j’ai pu m’apercevoir que des cas passaient alors qu’ils sont interdits, des bugs donc éventuels, maintenant corrigés.
  • au niveau de la conception objet, on s’aperçoit vite que c’est perfectible, que le code doit être non seulement OO mais aussi testable, ce qui implique un compromis des deux.
  • bonne expérience, à répéter de toute urgence, passionnant !

Tips & Tricks

Sous Visual Studio, à l’aide de TestDriven, le fait de se placer sur une méthode de test et de lancer les tests ne déroule ces derniers que sur la méthode.

ReSharper ou R# est un très très bon add-in, c’est assez remarquable ce qu’il arrive à conseiller comme réécriture du code, il reste à convaincre d’investir 200 € (par licence).

Blog Action …day

Posted by – October 15, 2008

Il parait que c’est le Blog Action day, le thème étant la pauvreté. En ces temps difficiles pour certains concernant la bourse, cela remet à niveau certaines échelles de valeurs.

Bien entendu, on pourra regretter qu’il n’y ait qu’un jour par an pour ce type d’action. Cela a au moins le mérite de rappeler encore tout le chemin qu’il reste à faire pour rehausser le niveau de vie des pays du sud notamment et endiguer tous les problèmes liés à la pauvreté (malnutrition, maladies, fuite des populations, développement durable, …).

Alors, toi aussi, donne ce que tu peux à l’une des associations de ton choix :

Il suffirait de seulement 3 milliards d’€ pour endiguer la faim auprès de 19 millions d’enfants en Afrique. A l’aune des 1 700 milliards promis pour sauver les banques européennes, on sent qu’il y a un sacré hiatus.

L’année dernière, c’était sur l’environnement.

Flock 2.0

Posted by – October 14, 2008

Testons la nouvelle mouture du navigateur social Flock.

Le principal avantage réside dans son interaction avec Flickr : la barre de visualisation est bien amenée, même si je lui préfère l’excellent Cooliris (ex PicLens), ou bien avoir les nouveautés de votre album (commentaires & co) ou vos contacts, ou encore la possibilité d’uploader vos photos directement à partir du navigateur.

Pour Facebook, Flock vous mettra la liste des dernières actions menées par vos 2 245 amis.

Enfin, une possibilité d’écrire vos billets directement sous Flock en utilisation l’API de votre moteur de blog. Là encore, je lui préfère Evernote, bien plus simple et pratique.

Pour le reste (Delicious, Facebook, …), j’aurais besoin d’une explication de texte.

A suivre car je ne suis toujours pas convaincu.

Evènements du mois de novembre 2008

Posted by – October 14, 2008

2 évènements du mois de novembre à ne pas manquer :

ALT.NET Paris

La prochaine rencontre aura lieu le mardi 4 novembre.

[EDIT] : La rencontre aura lieu dans les locaux de Valtech qui nous prêtent gentiment un local, pizzas incluses, Valtech. RDV à 20h.

Vous pouvez déjà visiter le portail afin de vous inscrire au groupe Google (pour la liste), ou au groupe Facebook pour l’inscription aux évènements.

Teasing : pour cette rencontre de novembre, il y a de bonnes chances d’avoir un contributeur du projet Mono, un sujet d’actualités avec la sortie de la 2.0.

Paris Web 2008

Vous avez jusqu’à ce soir (14 octobre) pour obtenir un rabais sur le ticket d’entrée (-50 %) pour les passes techniques et décideurs. Pour ma part, les ateliers techniques du (samedi) 15 novembre semblent intéressants, avec un prix à 10 € HT, notamment :

  • RDFa versus µformats
  • jQuery
  • CSS

[EDIT] : les inscriptions sont ouvertes.

encore faudra-t-il se lever pour aller à Villejuif.