web-dev-qa-db-ja.com

karma-coverage(istanbul)を取得して、すべてのソースファイルのカバレッジを確認するにはどうすればよいですか?

コード構造

私は次のようなappディレクトリ構造を持っています

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

私のtestディレクトリは現在このように見えます

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

これまでのところ、GraphToolbarファイルとsettings/ファイルしかカバーしていないことに注意してください。 OverviewCanvasControl.jsまたはnodes/ファイルのテストはまだありません

カルマ設定

私のkarma.conf.jscoveragekarma-coverage を参照):

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

問題

Karmaを実行すると、カバレッジプリプロセッサとレポーターが実行されますが、仕様が既に書き込まれているファイルのみがチェックされます。カバレッジのないOverviewCanvasControl.jsファイルとnodes/ファイルのカバレッジが0%であることを報告したいと思います。新しいファイルが作成されてカルマが実行されたときに、そのファイルにまだ仕様がないことをキャッチしたいと思います。

Karmaにall一致するソースファイルのカバレッジをチェックさせるにはどうすればよいですか?

私が思いついた解決策:ソースツリーをウォークし、各ソースJSファイルにスペックファイルが存在することを確認します。これは、各ソースファイルに対応するSpec.jsファイル(対応するディレクトリ構造に存在する)があることを前提としています。

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

タスクは 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"
    });
  });

これをうなり声のタスクとしてパッケージ化してNPMに公開してみませんか?

これは主に、プロジェクトの特定のパスと命名規則に大きく依存しているためです。それはまだディレクトリ/ファイルを除外していません(これは必要かもしれません)そしてあなたが*Spec.jsをしなければそれは機能しません。 Imoは、すべてを外部化して構成可能なタスクにするよりも、このスニペットを取得してカスタマイズする方がおそらく簡単です。これは後で変更される可能性があります。 ????

私を検索したところ、とても簡単だとわかりました。これをkarma.conf.jsに追加します。

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

BRクリス

4
cschuff

私はこれに苦労していました、そして私はかなり素晴らしい解決策を見つけました。

テストを実行する前に、jsファイルをウォークスルーし、単一のスペックファイルでそれらを要求するタスクを実行します。これにより、ファイルがインストルメント化され、コードカバレッジが正しく生成されます。イスタンブールは仕様で要求されるファイルのみを計測するため。コードからではなく、仕様からカバレッジを表示します。これでこの問題が修正されます。

それはセコイアのマクダウェルの反応に触発されたものであり、他の人の助けになることを願っています。

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

3
prnjanuario