Create CouvertureKarma authored by Ioan-Marius Bilasco's avatar Ioan-Marius Bilasco
Dans cette page je vais détailler le processus d'obtention de données de couverture des tests QUnit en utilisant [Karma](https://www.npmjs.com/package/karma).
## Prerequis
- Ouvrir un terminal au niveau de votre projet
- Installer Karma
```
npm install karma
alias karma='nodejs node_modules/karma/bin/karma'
```
- Installer qunit et dépendances
```
npm install qunitjs
npm install karma-qunit #permet de charger les dépendances qunit depuis karma
```
- Installer sinon.js et dépendances, si usage de sinon.js
```
npm install sinon
npm install sinon-qunit #vous n'avez plus à utiliser le fichier sinon-qunit-2.0.1 que je vous ai mis à disposition
npm install karma-qunit #permet de charger les dépendances qunit depuis karma
npm install karma-sinon
```
- Installer coverage
```
npm install karma-coverage #permettent de réaliser des mesures de couverture sur les tests
```
- Installer lanceurs de navigateurs
```
npm install karma-firefox-launcher
npm install karma-chrome-launcher
npm install karma-phantomjs-launcher
```
## Exécuter des tests QUnit
- Afin d’exécuter les tests en utilisant Karma, il faut définir un fichier karma.conf.js dans lequel vous configurez l'exécution de tests qunit :
```
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['qunit'], //remplacer par frameworks: ['qunit','sinon'] - si usage de sinon
// list of files / patterns to load in the browser
files: [
'src/*.js',
'test/money_test.js'
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'src/*.js':['coverage']
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress','coverage'],
coverageReporter: { type: 'lcov', dir: 'reports', subdir: 'coverage'},
// web server port
port: 9876,
// 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_DEBUG,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['Firefox'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: true,
// Concurrency level
// how many browser should be started simultaneous
concurrency: Infinity
})
}
```
- le fichier karma.conf.js peut être partiellement généré par la commande suivante
```
$ karma init karma.conf.js
```
- Si vous tests redéfinissent la méthode window.alert vous devriez les ré-écrire partiellement, car la function window.alert est utilisée par Karma. Pour éviter tout effet de bord:
- sauvegarder le contenu de window.alert avant re-définir.
- ré-définir à votre convenant la fonction window.alert
- après avoir réalise le traitement spécifique de votre test, remettez window.alert à son contenu initial
```
var old_alert=window.alert;
window.alert=function(){...};
//appels provoquant la levée des alertes
...
//re-mettre en place la version normale de window.alert
window.alert=old_alert;
//assertions ou autres
assert.ok(...);
```
- Si vos tests alterent la méthode window.alert en lui associant un spy ou un stub, vous devez penser à rétablir la fonction à son état initial .restore()
```
sinon.spy(window,"alert");
...
//assertions ou autres
assert.ok(window.alert.calledOnce);
...
//rétablir l'état initial
window.alert.restore();
```
- Il n'y a pas de support pour l'intégration automatique de qunit-composite (pas de karma-qunit-composite)
- impossible de tester money_test_suites.js
## Obtenir des données de couverture
Afin d'obtenir les données de couverture plusieurs étapes doivent être réalisées :
- instrumenter le code .js de telle sorte à ce que lors de l'exécution des traces soit générées. La tâche "preprocessing" doit être configurée dans ce sens. Dans le code ci-dessus on instrumente le code .js qui se trouve dans le dossier "src" (src: 'src/*.js'). Si besoin, renommer le filtre pour qu'il reflète la structure de votre code (par exemple, src: 'js/*.js').
- exécuter les tests, en remplaçant les sources .js avec les sources instrumentées. Afin de faciliter ce processus, nous pouvons faire usage des packages nodejs de générer des serveurs à la volée et d'éxecuter les scripts dans un environement ou les sources js sont associées aux sources instrumentées.
- l'exécution de tests se réalise avec la commande
```
$ karma start # lance le serveur de tests + exécute les tests + selon singleRun arrête ou non le serveur de tests
ou
$ karma run # si serveur de tests karma n'a pas été arrêté
```
- Par la suite, les tests qunit s'exécutent et des traces d'exécution sont gardées en ___reports/coverage___
- Des données de couverture au format LCOV (pour compatibilité sonar) sont également générées ___reports/coverage/lcov.info___
= Intégration des données de couverture en Sonar
Mettez à jour le fichier sonar-project.properties pour indiquer que les données de couverture se retrouvent dans .tmp/coverage/reports/lcov.info
```
...
sonar.javascript.lcov.reportPath=reports/coverage/lcov.info
```
Relancez sonar-runner
\ No newline at end of file