Le , par christophe @churpeau

Premiers pas dans les tests en javascript

Contexte

Les tests sont importants pour s'assurer que l'application est toujours en état de fonctionner. C'est aussi rassurant pour le développeur avant de faire sa mise en prod de vérifier que les fonctionnalités marchent encore. L'objectif de ce billet et d'avoir un apercu de quelques outils permettant de tester du javascript coté navigateur, jusqu'au tests sur IE dans une machine virtuelle.

Le fichier de test

Il existe de nombreuses libraries pour faire des tests unitaires en javascript, à commencer par la librarie native de nodejs. Mon choix s'est d'abord porté sur Chai, style TDD assert, avant de me rendre compte qu'il n'était pas compatible avec les anciennes versions d'IE et j'ai donc exploré Proclaim.

Installation :

npm install --save-dev proclaim

Voici donc ci-dessous un test tout simple :

tests/test.js

var assert = proclaim;

test('basic DOM test', function() {
    var el = document.createElement("div");
    el.id = "myDiv";
    el.innerHTML = "Hello World!";
    document.body.appendChild(el);
    var myEl = document.getElementById('myDiv');
    assert.equal(myEl.innerHTML, "Hello World!");
    document.body.removeChild(el);
    el = null;
    myEl = null;
});

Mocha

Ensuite, nous avons besoin d'une librairie qui encapsule ces tests et les lancent. Mocha est l'une des plus connues.

Installation :

npm install --save-dev mocha

On peut lancer nos tests avec un fichier html:

tests.html

<html>
<head>
    <meta charset="utf-8">
    <title>Mocha Tests</title>
    <link rel="stylesheet" href="node_modules/mocha/mocha.css" />
</head>
<body>
    <div id="mocha"></div>
    <script src="node_modules/mocha/mocha.js"></script>
    <script src="node_modules/proclaim/lib/proclaim.js"></script>
    <script>
        window.assert = proclaim;
        mocha.setup({ ui: 'tdd' });
    </script>
    <script src="tests/test.js"></script>
    <script>
        mocha.checkLeaks();
        mocha.run();
    </script>
</body>
</html>

Karma

Karma permet de lancer les tests simultanément dans plusieurs navigateurs. Il faut installer les plugins correspondant aux navigateurs, créer un fichier de configuration, et on a le résultat dans la console.

Installation :

sudo npm install -g karma-cli && npm install --save-dev karma karma-mocha karma-proclaim karma-chrome-launcher karma-firefox-launcher

karam.conf.js

module.exports = function(config) {
    config.set({

        // base path, that will be used to resolve files and exclude
        basePath: '',

        frameworks: ['mocha', 'proclaim'],

        browsers: [
            'Firefox',
            'Chrome',
        ],

        files: [
            'mocha.conf.js',
            'tests/test.js',
        ],

        // test results reporter to use
        // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
        reporters: ['progress'],


        // enable / disable colors in the output (reporters and logs)
        colors: true,


        // level of logging
        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
        logLevel: config.LOG_INFO,


        // enable / disable watching file and executing tests whenever any file changes
        autoWatch: true,
    });
};

mocha.conf.js

window.mocha.setup({ui: 'tdd'});
window.mocha.checkLeaks();

Puis lancer avec karma start.

Karma et IE

Il est possible de lancer ces tests sur IE via une machine virtuelle. Pour ca, il faut d'abord installer ievms qui se charge de créer des marchines virtuelles dans VirtualBox.

De retour sur le projet, il faut installer un nouveau plugin:

npm install --save-dev karma-ievms

Puis rajouter dans la configuration de karma:

//...

        browsers: [
            'Firefox',
            'Chrome',
            'IE6 - WinXP',
            'IE7 - WinXP',
            'IE8 - WinXP',
            'IE9 - Win7',
            'IE10 - Win7',
            'IE11 - Win7'
        ]

A noter: Karma utilise socket.io, et sur les anciens navigateurs il vaut mieux avoir flash installé.

Testling

Pour terminer, on peut utiliser Testling pour mettre en place ces tests à chaque push dans github et avoir un badge indiquant les navigateurs testés.

Il suffit de configurer le web hook puis de modifier le fichier package.json :

  "testling": {
    "html": "tests.html",
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "chrome/latest",
      "chrome/canary",
      "firefox/3..3.6",
      "firefox/latest",
      "firefox/nightly",
      "safari/latest",
      "opera/11.0..latest",
      "iphone/6",
      "ipad/6",
      "android-browser/latest"
    ]
  }
comments powered by Disqus