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

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).

Annuaires des Universités Françaises

Au jour d’aujourd’hui quasiment toutes les universités Françaises proposent des « annuaires » contenant des données de contact de leurs élèves  et de leur personnel. À première vue c’est un service très utile, mais une grande partie des implémentations que j’ai pu trouver sont assujetties a d’énormes problèmes;

Lire la suite

17 ans après: une faille Windows

On dirais que Microsoft n’a vraiment pas la vie simple ces dernières semaines, après la grosse faille dans IE, voilà qu’un employé de Google (Tavis Ormandy, membre de la « Security Team ») découvre une grosse faille dans…. le système 16bit…

C’est bête direz-vous, d’avoir, en temps de processeur 64bit, une faille dans un sous-système à 16bit, mais le fait est que, par ce biais il est possible d’exécuter n’importe quel code, avec les privilèges système, et voilà comment ça marche:

Lire la suite

yPortableWS: un mini serveur web portable

L'interface de gestion de yPortableWS

L'interface de gestion de yPortableWS

J’ai fini ce soir l’un de mes petits projets, qui s’avère être un mini-serveur-web-sans-installation.

Bref, de grands mots pour une ch’tite chose, le tout n’étant qu’une conglomérat d’applications déjà existantes. À savoir:

  • LightTPd (serveur web ultra-léger, en remplacement d’Apache pour le coup)
  • MySQL (un grand classique nous le savons)
  • PHP 5.2.12 (la 5.3.0 m’ayant donné quelques maux de tête…)
  • phpMyAdmin

Et une petite interface de ma facture qu’on peut voir à droite. Le tout se voit encore complété par un « mini-portail » en PHP qui fait office de « je te montre ce qui est installé, et je te donne des liens ». Enfin, je vais arrêter là le grand discours,

c’est donc juste un petit logiciel pour ceux qui (comme moi) veulent pouvoir emmener leurs environnement de développement préféré sur un clef USB, et qui veulent pouvoir s’en servir même s’il n’ont pas de privilèges d’administrateur sur la machine concernée…

Le tout est gratuit et open-source, j’espère que ça vous plaît! Pour les intéressés d’entre vous: c’est par là (en anglais)