2014-03-28 82 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

相關問題