test reporter karma coverage karma-runner istanbul

karma runner - reporter - ¿Cómo obtener la cobertura de karma(Estambul) para verificar la cobertura de TODOS los archivos de origen?



karma-jasmine-html-reporter (3)

Después de buscar I mientras encontré que es bastante fácil. Agrega esto a tu karma.conf.js:

coverageReporter: { includeAllSources: true, reporters: [ ... ] }

BR Chris

La estructura del código

Tengo una estructura de directorio de app como

scripts/sequoia/ ├── GraphToolbar.js ├── nodes │   ├── activityNode.js │   └── annotationNode.js ├── OverviewCanvasControl.js └── settings    ├── GraphControlSettingsFactory.js    └── SnapContextFactory.js

Mi directorio de test actual se ve así

test/spec/ ├── GraphToolbarSpec.js ├── settings │   ├── graphControlSettingsFactorySpec.js │   └── snapContextFactorySpec.js └── test-main.js

Tenga en cuenta que solo tengo GraphToolbar y la settings/ archivos cubiertos hasta ahora; todavía no hay pruebas para OverviewCanvasControl.js o los nodes/ archivos.

La configuración karma

En mi karma.conf.js (la coverage refiere a la coverage de karma-coverage ):

preprocessors: { ''scripts/sequoia/**/*.js'': [''coverage''] }, reporters: [''progress'',''coverage''],

El problema

Cuando ejecuto karma, el preprocesador y reportero de cobertura se ejecuta, pero solo verifica los archivos que ya tienen especificaciones escritas . Quiero reportar una cobertura del 0% para OverviewCanvasControl.js y los nodes/ archivos que no tienen cobertura. Cuando se crea un nuevo archivo y se ejecuta karma, quiero que detecte que ese archivo aún no tiene Spec.

¿Cómo puedo hacer que Karma verifique la cobertura de todos los archivos fuente coincidentes, no solo aquellos con especificaciones ya creadas?


Estuve luchando con esto y encontré una solución bastante buena.

Antes de ejecutar las pruebas, ejecuto una tarea que recorrerá sus archivos js y los requerirá en un solo archivo de especificaciones. Esto hará que los archivos se instrumenten y la cobertura del código se genere correctamente. Ya que Estambul solo instruye archivos que son requeridos por las especificaciones. Mostrando la cobertura de sus especificaciones y no de su código. Esto solucionará este problema.

Se inspiró en la respuesta de la secuoya mcdowell y espero que ayude a otros.

http://shared-mind.tumblr.com/post/89641439478/istanbul-code-coverage-force-instrumentation-of-all-file


Solución Se me ocurrió: caminar por el árbol de origen y verificar que exista un archivo de especificaciones para cada archivo JS de origen. Esto supone que cada archivo de origen tiene un archivo Spec.js correspondiente (que reside en una estructura de directorio correspondiente).

  • app/scripts/moduleFoo.jstest/spec/moduleFooSpec.js
  • app/scripts/ns1/Utils/foo_bar.jstest/spec/ns1/Utils/foo_barSpec.js

La tarea se basa en el módulo fs-tools npm.

var fsTools = require(''fs-tools''); //... module.exports = function(grunt) { ... etc. (gruntfile setup) grunt.registerTask(''checkspecs'', ''ensure that all js files have Specs'', function(){ var done = this.async(); var srcPath = ''./''+cfg.app+''/scripts/''; //Where are your scripts? var testPath = ''./test/spec/''; //Where are your specs? var missingSpecs = []; fsTools.walk(srcPath, ''.js$'', function(path,stats,callback){ var specPath = testPath + path.substring(path.indexOf(''ptc'')+4); //strip .js, add Spec.js specPath = specPath.split('''').slice(0,-3).join('''') + ''Spec.js''; if(!grunt.file.exists(specPath)){ missingSpecs.push(path); } callback(); }, function (err){ if(err){ grunt.log.error(err); done(false); } if(missingSpecs.length > 0){ grunt.log.warn(''`Spec.js` files are missing for the following files!!''); missingSpecs.forEach(function(path){ grunt.log.warn(path); }); }else{ grunt.log.ok(''Spec files present for all source files''); } done(!err); //fail only if fsTools.walk throws //done(!missingSpecs.length); //fail if any specs are "missing" }); });

¿Por qué no empaquetas esto como una tarea ronca y publicas en NPM?

Sobre todo porque se basa mucho en las rutas específicas y convenciones de nomenclatura en su proyecto . No excluye directorios / archivos todavía (esto puede ser necesario) y si no lo hace *Spec.js no funcionará. Es probable que sea más fácil tomar este fragmento y personalizarlo que externalizar todo y convertirlo en una tarea configurable. Podría cambiar esto más tarde. 😺