我正在使用gulp-istanbul通过Gulp生成JavaScript单元测试覆盖率报告。有没有办法配置伊斯坦布尔生成我的gulp流中所有JS文件的完整覆盖率报告,而不仅仅是测试用例触及的文件。
我正在开发一个包含大量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 :(得分: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
答案 1 :(得分:4)
当需要文件时执行Istanbul hook。因此,您需要要求所有文件才能将它们包含在最终报告中。您可以通过在gulp任务中注入一个tap并在所有选定文件上调用require来实现此目的:
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 ]
) );
} );
} );
答案 2 :(得分:4)
我今天一直在努力解决这个问题,但在Google上找不到任何答案。我终于想出了一个非常类似于答案的答案,但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'
}));
});
});
有一个与此相关的票据,我发现在gulp-istanbul代码中引用了一些巫术魔法,以使事情有效:https://github.com/gotwarlost/istanbul/issues/112
答案 3 :(得分: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});