全面报道伊斯坦布尔报道

时间:2014-03-28 01:34:46

标签: javascript unit-testing mocha gulp istanbul

我正在使用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 ]
                ) );
        } );
} );

4 个答案:

答案 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});