Le coût des tests unitaires

Les tests unitaires sont un thème récurrent pour moi ces dernières semaines; entre les discutions sur Stackoverflow et d’autres forums et les tests que j’écris pour deux projets en cours, je me suis posé quelques questions quant au coût réel de ces tests unitaire.

C’est surtout un article de Thomas Brandt (en allemand: « TDD in der (meiner) Praxis – Wunsch und Wirklichkeit ») qui m’a fait réfléchir sérieusement. Dans son article Brandt décrit assez bien le gouffre bel et bien présent entre la théorie et la pratique du Test Driven Developpement. De but en blanc, il adhère plutôt aux principes du TDD;

Je dois tout d’abord dire que le Test Driven Development, surtout le principe „test first“, est une manière plutôt « sexy » de développer. Elle permet très certainement d’améliorer l’architecture du logiciel et nous évite de faire certaines (petites) erreurs.
— Traduction relativement libre des propos de T. Brandt

Il considère donc TDD comme un outil performant – du moins d’un point de vue purement académique. Mais la suite immédiate constitue un doute;

La question est simplement: à quel prix?

Comme dit, hormis T. Brandt et moi, bien d’autres personnes semblent se poser la question, et la question la plus fréquente est la suivante: est-ce que l’utilisation de tests unitaires produit-elle réellement des logiciels de meilleure qualité, et est-ce que les efforts à investir sont-ils réalistes?

Condensée, la question se résume à un simple:

Ça me coûte combien les tests unitaires?

Souvent la question implique, que celui qui la pose pense que les tests unitaires sont bien trop chers pour les appliquer de manière conséquente. Je me souviens d’une discussion que j’ai eue à propos de l’intérêt d’une couverture de test totale en dehors de l’idéal théorique. Rapporté aux efforts à fournir j’ai répondu que « non » à l’époque.

Au jour d’aujourd’hui je trouve que toutes ces questions sont simplement mal posées, car ce n’est pas connaitre le coût des tests unitaires qui est important, mais:

Combien me coûte l’omission des tests unitaires?

Et voici ma réponse, illustrée à l’aide d’un exemple concret;

L’un de mes projets actuels comprend un grand nombre de composantes distribuées. J’ai découvert une erreur dans le projet, ce qui m’a forcé à refactoriser deux classes. Le tout m’a pris environ 1 heure. Lancer les tests unitaires? Environ 30 secondes. 30 secondes qui m’ont fait découvrir que certains comportements n’étaient plus comme prévus initialement. Il m’a fallu environ 20minutes pour les corrections. L’écriture des tests m’avaient coûté environ 45min.
Le bilan est donc environ de deux heures.

Sans les tests unitaires, je n’aurais surement pas remarqué une partie des erreurs immédiatement. J’aurais donc eu 1 heure de refactorisation, plus un temps plus ou moins indéterminable, certainement réparti sur plusieurs jours, pour corriger les problèmes passés inaperçus lors du changement. La probabilité que ce temps dépasse largement une heure est relativement grande (débugger « à la main », recréer les conditions dans des applis multi-threadées etc…).

Pour ma part, je conclus que pouvoir calculer avec un temps défini (en ayant des tests couvrant une partie réaliste du logiciel – pas 100%) est plus intéressant que la navigation à l’aveuglette tant pratiquée.

Faites des tests! ;)

Un peu de noSQL pour MariaDB

Logo de MariaDB

MariaDB un fork de MySQL

Un message très heureux m’est parvenu de MariaDB, le fork très prometteur de MySQL. Avec un commit très récent dans leur repository, MariaDB se permet d’assouplir un peux le modèle relationnel classique. Avec l’introduction des colonnes dynamiques (traduction libre de « Dynamique Column ») la prochaine version (5.3) de MariaDB contiendra donc apparemment un zeste de noSQL!

Un but principal lors du développement était de rendre ces colonnes utilisables via une syntaxe SQL classique. De façon interne les colonnes dynamiques sont sauvegardées en tant que BLOB (Binary Large Object).

Pour illustrer un peux le fonctionnement de ce nouveau type, un petit exemple:

Select All Code:
1
2
3
4
INSERT INTO exemple (nom, classe, prix, attributs) VALUES
("HTC Desire Z", "telephone", 420, COLUMN_CREATE(1.5, "Gris")),
("Nokia E7", "telephone", 509, COLUMN_CREATE(32, "noir", 2, "Clavier")),
("Lenovo Thinkpad E420", "ordinateur", 1019, COLUMN_CREATE(1, "noir", 3, "Win7 Pro", "500Go"));

Comme vous pouvez donc le voir, le tout ressemble à une requête tout à fait classique, au détail de la colonne « attributs » près. Dans l’exemple chaque entrée possède donc des données classiques, plus un champ « attributs » qui contiens un nombre variable de données (N.B.: contrairement aux champs classiques, une entrée de tableau dynamique ne possède qu’un numéro d’adressage, mais apparemment les développeurs comptent encore changer ça).

Pour créer une entrée pour la colonne on utilise donc COLUMN_CREATE(), pour mettre à jours ou effacer une entrée il faut utiliser la fonction COLUMN_ADD() dans un appel UPDATE normal:

Select All Code:
1
2
UPDATE exemple SET attributs=COLUMN_ADD(attributs, 1, "jaune")
  WHERE COLUMN_GET(attributs, 1 AS CHAR(10)) = "noir";

L’exemple illustre aussi assez bien l’utilisation de COLUMN_GET() qui permet d’accéder à un attribut de la colonne. Il existe aussi COLUMN_LIST() qui retourne la liste des colonnes dynamiques présentes.

Si jamais vous souhaitez déjà essayer cette nouvelle fonctionnalité, jettez-vous sur votre compilateur et le repository de MariaDB; les binaires ne seront disponibles qu’avec la version 5.3 de MariaDB.

Les composants tiers et les tests unitaires

Tests logiciels - une science pour sois

Je viens tout juste de lire l’étude Software Integrity Risk Report qui à été réalisée à la demande de Coverity. Dans les grandes lignes l’étude résume assez bien une impression que j’ai depuis bien longtemps; le développeur moyen est bien moins soucieux de la qualité d’un logiciel tiers qu’il intègre dans un projet que de la qualité de son propre code.

Concernant les chiffres, l’étude dit que 90% des (330) développeurs utilisent des sources tierces (qu’elles soient Libres de droit ou propriétaires) dans leurs logiciels. Par contre seul environs 40% de ces développeurs disent procéder à des tests automatisés sur ces sources (contre plus de 75% pour les sources « maison »). Il en est de même (à quelques pourcents près) pour les tests manuels et d’intégrité (stress-testing/functional-testing).

Une certaine unanimité règne quant aux retards pris à cause d’une qualité insuffisante du code tiers; plus de 140 développeurs ont répondu qu’une grande partie des retards de lancements ou des rappels étaient dû à des soucis avec des sources tierces.

Le mot final: TESTEZ! TESTEZ! TESTEZ!

Linux dans un navigateur

Cela faisait longtemps qu’on savais tous que le Javascript n’était pas que là pour valider des formulaires (X)HTML et à faire quelques effet sur les sites web. Mais aujourd’hui M. Fabrice Bellard a encore frappé avec une démonstration d’envergure!

Ce génie a bel et bien réalisé un émulateur x86 en pure javascript! Je vous épargne les détails techniques ici (ils sont lisibles sur le site de Fabrice Bellard). En gros, JSLinux est un émulateur de 486, sans FPU et MMX, mais avec une unité de gestion mémoire (MMU) complète!

Une particularité technique (qui à rendu possible cet exploit) est l’utilisation extensive de tableaux typés (spécification par là) qui sont disponibles depuis peu dans les navigateurs récents (Chrome 11 et Firefox4 actuellement, Opera étant entrain de rattraper le retard si mes informations sont bonnes).

Concernant la « distro » linux installée dans la démo, elle est pas mal complête; kernel 2.6.20, BusyBox, vi, qEmacs et un compilateur C (TinyCC, que j’ai eu la joie d’essayer pour la première fois =)

Sur ce, je vous laisse découvrir vous-même cette merveille: JSLinux (la page met quelques secondes à charger)

Installer Mono 2.10 sous CentOS avec YUM

Et moi voilà de retour avec une petite bricole Linux: installer Mono 2.10 sur CentOS (5.6 pour le coup).

Quelques heures de recherche sur le net m’ont toujours amenées vers le même résultat; compiler depuis les sources… et avec la belle liste des dépendances, rien de très amusant… la solution: se casser un petit-peu la tête!

Lire la suite

Restaurer des clefs SSL privées perdues!

La manip’ que je décris aujourd’hui est pas mal pointue, surtout vu le sujet abordé!

Tout d’abord l’histoire: j’ai malencontreusement effacé, ou plutôt remplacé la clef privée utilisée pour le cryptage SSL sur l’un de mes serveurs. Sachant que sans cette clef le serveur ne marcherais plus une fois redémarré!

Ce qui m’a sauvé? Le fait que Apache charge le fichier complet en mémoire! J’aurai donc pû faire un dump du heap/stack du processus apache2 et chercher…. ou bien chercher pendant 2h sur Google pour trouver le petit outil suivant

Lire la suite

Imprimante HP Color Laserjet 2600n sous W7

Bonjour à tous; voilà la grande nouvelle; je suis maintenant parmi les utilisateurs de Windows 7 (3semaines maintenant) et plutôt satisfait. Mis à part deux petites pannes de pilotes (résolues maintenant) rien à reprocher, si ce n’est que l’imprimante Laser de HP (CLJ2600n) qui est chez ma mère m’a posé un petit lapin ce matin quand j’ai voulu l’utiliser:

Enfait je pensais que tout allais bien fonctionner du premier coup – sous Vista ca marchais – mais apparemment les pilotes pour cette imprimante réseau ne sont plus sur Windows Update pour W7, et HP propose seulement une version « Plug and Play » sur leurs site (par là: page de support HP pour la 2600n) qui est destinée au fonctionnement via USB – du moins officiellement.

Lire la suite

7 Astuces Google qui peuvent vous sauver la vie!

Tout le monde utilise Google (à quelques exceptions près…) comme moteur de recherche, mais qui savais qu’on peut utiliser Google pour trouver la définition d’un mot, convertir des Euros en Levs Bulgares, ou limiter la recherche à des information comprises entres certaines dates?

Voici quelques « Astuces » Google, qui peuvent d’avérer bien utiles!

Lire la suite

jQuery: transformations CSS animées pour Opera 10.50

J’ai découvert il y a quelques temps les transformations CSS d’abord disponibles sur WebKit (le moteur de rendu derrière Safari et Google Chrome), puis s’est rajouté Firefox, et dernièrement Opera avec la version 10.50.

Comme toujours les implémentations sont différentes (sans parler d’Internet Explorer qui ne les supporte pas du tout…) mais le script de Zachstronaut (un « hotpatch » de jQuery enfait, qui ajoute la propriété transform à la fonction $.css() et rotate ainsi que scale à $.animate()) fonctionnait bien sous WebKit et Firefox…

Malheureusement l’implémentation des Transformations CSS d’Opera ne retournais pas de valeurs « lisibles » mais une matrice de données, pour laquelle je n’ai pas trouvée de documentation. J’ai donc pris quelques détours, et en passant par la fonction getComputedStyle() j’ai pu récupérer le nécessaire pour faire fonctionner les animation sur Opera.

La version modifiée du script se trouve par là (vous y trouverez aussi un example pour ceux qui ne connaissent pas les transformations CSS).

LMGTFY.com, ou « comment les aider à chercher? »

Si l’on a le malheur de passer comme « geek » (ou expert des « nouvelles technologies » – pour être politiquement correcte)  on se retrouve souvent à jouer la Hotline pour les amis et autres connaissances. La plupart du temps il nous reste qu’a lancer un moteur de recherche.

La science "Google"

La science "Google"

Pour nous aider, les gens derrière LMGTFY, pour Let Me Google That For You, ont créé leurs site; vous entrez une recherche, et le site vous génère une « animation » qui montre comment il faut chercher avec Google. Vous envoyez le liens à votre connaissance et vous la laissez apprendre…

Une belle idée je trouve – Amusez vous ;)

P.S.: Pour les fans du logos Google: les Google Doodles (c’est la collection officielle de tous les logos thematiques :P )