2014-03-28 54 views
14

我正在使用gulp-istanbul通过Gulp生成JavaScript单元测试覆盖率报告。有没有办法将伊斯坦布尔配置为在我的gulp流中生成所有JS文件的完整覆盖报告,而不仅仅是测试用例所触及的文件。Full Gulp Istanbul覆盖率报告

我正在研究一个有很多JS的项目,但没有进行单元测试,我们正在尝试增加测试覆盖率。我希望有一份覆盖面报告,首先显示大部分文件的0%覆盖率,但随着时间的推移,覆盖率会有所增加。

gulp.task('test', function() { 
    gulp.src([ my source glob ]) 
     .pipe(istanbul()) 
     .on('end', function() { 
      gulp.src([ my test spec glob ]) 
       .pipe(mocha({ 
        reporter: 'spec' 
       })) 
       .pipe(istanbul.writeReports(
        [ output location ] 
       )); 
     }); 
}); 
+0

我知道你有固定你的问题,但检查我的答案,似乎他们已经添加了一个更简单的方法,直接进入吞噬伊斯坦布尔。可能值得检查/确认它给出相同的结果。 –

回答

3

展现覆盖所有文件你必须做两件事情:

  • 项目中的所有文件应包含在[my source glob]

  • 必须要求所有文件,换句话说,必须在项目中的所有文件上调用require(),因为istanbul可能会更改默认的require()以计算文件的覆盖率。

您可以在测试文件的开头写的是这样的:

for([all .js files in project]){ 
    require([file]) 
} 

您可以使用require-dir了点。

,而使用这样的:需要的文件时执行

var requireDir = require('require-dir'); 
var dir = requireDir('./projectFolder', {recurse: true}); 
4

伊斯坦布尔挂钩。因此,您需要要求所有文件才能包含在最终报道中。您可以通过注入你的任务一饮而尽内自来水实现这一​​目标,并在所有选定的文件调用需要:

gulp.task('test', function() { 
    gulp.src([ my source glob ]) 
     .pipe(istanbul()) 
     .pipe(tap(function(f) { 
      // Make sure all files are loaded to get accurate coverage data 
      require(f.path); 
     })) 
     .on('end', function() { 
      gulp.src([ my test spec glob ]) 
       .pipe(mocha({ 
        reporter: 'spec' 
       })) 
       .pipe(istanbul.writeReports(
        [ output location ] 
       )); 
     }); 
}); 
+1

这个工程很好 - 只需要安装gulp-tap – vadimich

+0

gulp-tap会抛出这个错误'在转换类中没有writecb',我找不到原因。其余的代码完美地工作。任何想法? –

14

它实际上是更简单,现在,你只需要添加includeUntested到您的通话istanbul()

gulp.task('test', function() { 
    return gulp.src('./assets/**/js/*.js') 
     // Right there 
     .pipe(istanbul({includeUntested: true})) 
     .on('finish', function() { 
     gulp.src('./assets/js/test/test.js') 
      .pipe(mocha({reporter: 'spec'})) 
      .pipe(istanbul.writeReports({ 
      dir: './assets/unit-test-coverage', 
      reporters: [ 'lcov' ], 
      reportOpts: { dir: './assets/unit-test-coverage'} 
      })); 
     }); 
    }); 

来源:https://github.com/SBoudrias/gulp-istanbul#includeuntested

+0

我发现这个答案的关键部分是你正在返回gulp.src(...)。 – axlj

+0

@axlj据我所知,我认为这只是为了帮助计算每项任务运行所花费的时间。否则,最终会出现“3μs后完成测试” –

4

我一直在挣扎今日,发现在谷歌没有答案。我终于想出了一个与这里的答案非常相似的答案,但writeReports调用必须在调用mocha之前进行。

gulp.task('test', ['build'], function(done) { 
    gulp.src('lib/**/*.js') 
    .pipe($.istanbul({ includeUntested: true })) 
    .on('end', function() { 
     gulp.src(['test/helpers/**/*.coffee', 'test/spec/**/*.coffee']) 
     .pipe($.istanbul.writeReports({ 
      dir: './coverage', 
      reportOpts: { 
      dir: './coverage' 
      }, 
      reporters: ['html'] 
     })).pipe($.mocha({ 
      reporter: 'spec', 
      require: 'coffee-script/register' 
     })); 
    }); 
}); 

有与此相关的一票,我在吞气 - 伊斯坦布尔代码中找到引用之前一些巫术,使事情的工作:https://github.com/gotwarlost/istanbul/issues/112

+0

您可以对该答案发表评论 – chouaib

+1

@chouaib这样的完整答案不适合,也不属于评论。 –

+0

对于任何与此答案和gulp-mocha 4.0.x +苦苦挣扎的人,请确保你'返回gulp.src(...)'并听取'finish'事件。 – axlj

相关问题