faire du TDD javascript en ligne de commande avec QUnit

le 28 juin 2011, par Bruno Thomas

Récemment, j'ai voulu faire du TDD en ligne de commande (sans utiliser de navigateur), en javascript. J'ai eu beaucoup de mal à trouver une solution simple.

J'ai voulu utiliser JSUnit qui m'avait l'air assez répandu, mais il ne fait pas (simplement) de ligne de commande. Ou bien je n'ai pas trouvé, ou bien il fallait redévelopper une petite couche javascript par dessus. J'ai aussi voulu tester doh (Dojo Objective Harness), qui normalement est plutôt prévu pour faire des tests de dojo.

Et puis j'ai trouvé QUnit, qui paraissait lié à jQuery. Comme nous utilisons jQuery, il semblait plus logique d'utiliser cet outil. En l'utilisant, je me suis rendu compte qu'il ne nécessitait pas jQuery.

Cet article indique une version modifiée de QUnit qui fait le lien entre QUnit et QUnit-CLI. Téléchargez les 2 projets :
- QUnit modifié
- QUnit-CLI

Je vous propose une arbo projet comme celle-ci :

`-- src
    |-- main
    |   `-- js
    |       `-- monJavascript.js
    `-- test
        `-- js
            |-- lib
            |   |-- js.jar
            |   `-- qunit.js
            |-- suite.js
            `-- testMonJavascript.js
  • js.jar est le jar rhino
  • qunit.js est le fichier source qunit qui est contenu dans le premier lien
  • suite.js est le source javascript qui est dans QUnit-CLI/rhino

Il faut modifier suite.js comme suit :

  • supprimer la ligne load("../src/myLib.js"). J'ai préféré que ce soit chaque module javascript de test qui charge le code source correspondant
  • changer la ligne load("../qunit/qunit/qunit.js") pour pointer vers lib/qunit.js : load("lib/qunit.js")
  • en bas de fichier il y a l'import de tous les sources de test et aussi des tests qunit. Supprimer le load("../qunit/test/test.js") et ajouter la ligne load("testMonJavascript.js")

J'ai ensuite créé testMonJavascript.js comme suit :

load("../../main/js/monJavascript.js");

test("RetourneBienCoucou", function() {
	equals(coucou(), "coucou");
});

et exécuté :

~/src/projet_js/src/test/js$ java -jar  lib/js.jar  suite.js
js: Couldn't read source file "../../main/js/monJavascript.js:
    ../../main/js/monJavascript.js (No such file or directory)".
FAIL - RetourneBienCoucou
    FAIL|OK|Died on test #1: "coucou" n'est pas défini - ReferenceError
        { message: '"coucou" n'est pas défini', fileName: '', lineNumber: 0 }|
----------------------------------------
 PASS: 0  FAIL: 1  TOTAL: 1
 Finished in 0.045 seconds.
----------------------------------------

et créé monJavascript.js dans main/js :

function coucou() {  return "blah"; }

A présent l'exécution du test donne :

~/src/projet_js/src/test/js$ java -jar  lib/js.jar  suite.js
FAIL - RetourneBienCoucou
    FAIL|EQ||Expected: coucou , Actual: blah
----------------------------------------
 PASS: 0  FAIL: 1  TOTAL: 1
 Finished in 0.035 seconds.
----------------------------------------

Et finalement en remplaçant par un return "coucou" :

~/src/projet_js/src/test/js$ java -jar  lib/js.jar  suite.js
PASS - RetourneBienCoucou
----------------------------------------
 PASS: 1  FAIL: 0  TOTAL: 1
 Finished in 0.009 seconds.
----------------------------------------

Ceci permet de faire des tests javascript sans DOM. Nous verrons dans un prochain post comment faire des tests en simulant le navigateur avec env.js.

Exécuter la même commande sur plusieurs serveurs

le 21 mai 2011, par Florence Chabanois

Nous avons parfois besoin d'effectuer une même opération sur plusieurs serveurs. Les équipes exploitation connaissent bien cette problématique avec la multitude de frontaux à mettre à jour lors d'une mise en production. Les développeurs aussi. Nous devons créer un répertoire sur les serveurs de recette et d'intégration; suite à un bogue, nous partons à la recherche d'informations dans les logs sur les cinq frontaux; nous avons besoin de comparer les logs de production avec ceux de recette, etc. Il y a au moins trois possibilités à ce type de besoin : le faire à la main à la suite; utiliser clusterSSH; ou Gnome Connection Manager.

Conférence Agile France 2011

le 15 mai 2011, par Jean-Philippe Caruana

Du 26 au 27 mai 2011 se déroule la Conférence Agile France 2011 (ex-XP Days France) au Chalet de la Porte Jaune, à Paris. C'est un rendez-vous à ne pas manquer pour rencontrer des praticiens , échanger avec eux et découvrir des tas de choses. Conférence Agile France 2011 Cette année, barreverte est bien représenté avec pas moins de 4 sessions, dans l'ordre du calendrier : N'hésitez pas à vous inscrire, c'est un évènement à ne pas manquer. Le reste du programme est tout aussi alléchant. Je vous conseille également de vous inscrire au repas du jeudi soir : c'est toujours un moment très convivial où l'échange et la rencontre ne sont jamais loin. A bientôt au Chalet de la Porte Jaune !

Bus de données : les failles dans l'architecture

le 12 mai 2011, par Philippe Blayo

Après avoir basculé vers un bus de données rabbitMQ, nous décidons de supprimer son clustering, source potentielle de blocages en version 1.8, et qui posait, d'après un expert, des soucis à la base de données mnesia sur laquelle il s'appuie. Notre espoir était grand que cette source d'instabilité éliminée, l'architecture du bus serait enfin stable. Que neni ! De vils fantômes hantent les server.xml : des contextes tomcat inutilisés mais encore déployés leurrent la VIP (Virtual IP). En voulant équilibrer la charge des 14 serveurs (6 vivants et 8 fantômes) elle envoie 5 vivants sur un bus et 1 seul sur l'autre. Résultat : le bus surchargé s'effondre, nouvel incident.

Barre verte à l'échelle du projet? Définissez d'abord votre succès!

le 9 mai 2011, par Pascal Pratmarty

10 ans après sa parution, le Manifeste Agile n'a pas pris une ride. En réponse aux méthodologies de la fin du XXe siècle qui reléguaient le développement à une activité de simple traduction des spécifications fonctionnelles en langage machine, le mouvement Agile a replacé les équipes de développement au centre de la chaîne de valeur des projets logiciels.

final : un bytecode peut en cacher un autre

le 15 avril 2011, par Philippe Blayo

Quand le résultat d'un code Java me surprend, je regarde son bytecode avec javap -c. Prenons un exemple. Dans notre équipe, nous mettons les variables à final par défaut pour éviter des problèmes de concurrence [1]. J'ai découvert[2] que final pouvait changer le comportement de l'opérateur ternaire ? :, comme le montre ce code :

Quelques commandes SVN utiles

le 15 avril 2011, par Jean-Philippe Caruana

Eh oui, la grande mode est à git, mais nous sommes encore nombreux à (être obligés d')utiliser subversion, au travail par exemple. C'est mon cas. Comme j'ai une toute petite tête et que je préfère utiliser mes outils en ligne de commande, je note régulièrement les petites astuces avec svn. En voici certaines :

Sauvegardes mysql/wordpress avec git

le 1 avril 2011, par Bruno Thomas

Pour assurer les sauvegardes des données de ce site, j'avais commencé à faire un script bash qui faisait un dump uniquement si des données avaient changées. Mais il était insuffisant, car chaque changement provoquait la sauvegarde de toute la base de données. Pas vraiment incrémentale la démarche. JP m'a indiqué un article qui mentionnait l'utilisation de SVN pour des sauvegardes d'une base mysql. Mais bien sûr ! Un gestionnaire de version, c'est ce vers quoi le script allait m'acheminer pour :
  • ne garder que les deltas des changements
  • être capable de retrouver la dernière version du site en cas de crash serveur
  • pouvoir retrouver une version donnée du site dans le cas d'un problème de configuration par exemple
  • pouvoir dupliquer la sauvegarde à plusieurs endroits facilement avec l'historique
Autant réutiliser des outils éprouvés.

Comment tester les interractions avec le monde extérieur (via HTTP)

le 25 mars 2011, par Jean-Philippe Caruana

Il m'arrive fréquemment d'avoir à écrire du code qui doit parler avec un serveur HTTP externe, par exemple, sur mon projet actuel, nous interagissons avec :
  • un serveur de paiement
  • un serveur de publicités
  • un streamer vidéo
  • un serveur d'options client
J'aime bien écrire mon code de test avant d'écrire mon code de production, et j'imagine que vous en faites autant. C'est ainsi que nous avons développé au fil du temps une librairie de tests qui nous permet de simuler un serveur HTTP. Cet librairie lance un véritable serveur qui écoute sur une socket. Nous pouvons lui donner des réponses standard (réponse 200 avec contenu OK, réponse 40x ou 50x, redirect etc) mais également lui donner un comportement plus avancé en lui passant un TraiteurDeReponse. Cela nous permet de simuler tous les intervenants extérieurs à notre produit pour nos tests unitaires mais aussi pour nos tests d'acceptance.