J'essaie d'obtenir la couverture de code pour mon code TypeScript dans le cadre karma à l'aide d'Istanbul Dans karma.conf. Les fichiers TypeScript sont inclus. Le rapport de couverture de code vient pour le code JavaScript trans-empilé
Comment puis-je obtenir le rapport de couverture pour le code TypeScript?
Voici mon fichier karma.conf
.
module.exports = function(config) {
config.set({
// base path, that will be used to resolve files and exclude
basePath: '',
// frameworks to use
frameworks: ['jasmine'],
preprocessors: {
'src/**/*.ts': ['TypeScript', 'coverage'],
'test/**/*.ts': ['TypeScript']
},
typescriptPreprocessor: {
options: {
sourceMap: false, // (optional) Generates corresponding .map file.
target: 'ES5', // (optional) Specify ECMAScript target version: 'ES3' (default), or 'ES5'
module: 'AMD', // (optional) Specify module code generation: 'commonjs' or 'AMD'
noImplicitAny: true, // (optional) Warn on expressions and declarations with an implied 'any' type.
noResolve: false, // (optional) Skip resolution and preprocessing.
removeComments: true, // (optional) Do not emit comments to output.
concatenateOutput: false // (optional) Concatenate and emit output to single file. By default true if module option is omited, otherwise false.
},
// extra typing definitions to pass to the compiler (globs allowed)
// transforming the filenames
transformPath: function (path) {
return path.replace(/\.ts$/, '.js');
}
//options: {
// sourceMap: true,
//}
},
// list of files / patterns to load in the browser
files: [
'src/**/*.ts',
'test/**/*.ts'
],
// list of files to exclude
exclude: [
],
// test results reporter to use
// possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
reporters: ['progress','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_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera (has to be installed with `npm install karma-opera-launcher`)
// - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
// - PhantomJS
// - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
browsers: ['PhantomJS'],
// If browser does not capture in given timeout [ms], kill it
captureTimeout: 60000,
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false,
plugins: [
'karma-jasmine',
'karma-chrome-launcher',
'karma-phantomjs-launcher',
'karma-TypeScript-preprocessor',
'karma-coverage'
//require('../../../node_modules/karma-TypeScript-preprocessor/index.js')
]
});
};
Installez karma-TypeScript
:
npm install karma-TypeScript --save-dev
Mettez ceci dans votre karma.conf.js:
frameworks: ["jasmine", "karma-TypeScript"],
files: [
{ pattern: "src/**/*.ts" }
],
preprocessors: {
"**/*.ts": ["karma-TypeScript"]
},
reporters: ["progress", "karma-TypeScript"],
browsers: ["Chrome"]
Ceci exécutera vos tests unitaires TypeScript à la volée et générera une couverture html pour Istanbul ressemblant à ceci:
Pour exécuter l'exemple ci-dessus, vous devez installer quelques packages:
npm install @types/jasmine jasmine-core karma karma-chrome-launcher karma-cli karma-jasmine karma-TypeScript typescript
Il s'agit de la configuration complète pour le test unitaire du code Vanilla TypeScript, aucun tsconfig.json
n'est nécessaire dans ce cas. Pour des configurations plus complexes avec Angular, React, etc., vous trouverez des exemples dans les examples folder
et dans les integration tests
.
Nous utilisons instanbul-remap pour notre projet et cela fonctionne assez bien. Pour créer nos rapports de couverture, nous exécutons le script Shell suivant:
#!/bin/bash
PROJECT_PATH="$(dirname $0)/../"
cd $PROJECT_PATH
echo Creating coverage reports for `pwd`
if [ ! -d "target/dist" ]; then
echo
echo "target/dist directory not found. Must compile source with \`npm install\` before running tests."
echo
exit 1;
fi
COVERAGE_DIR=target/coverage-raw
REMAP_DIR=target/coverage-ts
mkdir -p $COVERAGE_DIR
mkdir -p $REMAP_DIR
# run coverage on unit tests only
echo Creating coverage reports for unit tests
node_modules/.bin/istanbul cover --dir $COVERAGE_DIR nodeunit `find target/dist/test/ -name *.test.js` > /dev/null
# re-map the coverage report so that TypeScript sources are shown
echo Remapping coverage reports for TypeScript
node_modules/.bin/remap-istanbul -i $COVERAGE_DIR/coverage.json -o $REMAP_DIR -t html
echo Coverage report located at $REMAP_DIR/index.html
Notre projet utilise nodeunit en tant que test, car il s’agit d’une application nodale. Cependant, je m'attendrais à ce qu'une approche similaire fonctionne pour le karma.
Il y a karma-remap-istanbul
qui s'intègre bien remap-istanbul
avec karma. La documentation est assez explicite, mais une chose - pour avoir un résumé sur la console, la configuration est text: undefined
(sinon la sortie de texte va dans le fichier).
Il est donc possible d’obtenir un résumé de la couverture directement à partir de karma. Toutefois, lorsque les sources ts
ne sont pas disponibles dans le même répertoire que karma.config.js
karma-remap-istanbul
, il faut encore un peu plus de développement concernant la configuration pour pouvoir générer des rapports HTML complets.