2014-03-28 14 views
14

Ich benutze Schluck-Istanbul, um JavaScript Unit Test Berichterstattung Berichte durch Gulp generieren. Gibt es eine Möglichkeit, Istanbul so zu konfigurieren, dass ein umfassender Bericht aller JS-Dateien in meinem Schluckstream erstellt wird und nicht nur die Dateien, die von einem Testfall berührt werden.Full Gulp Istanbul Coverage Bericht

Ich arbeite an einem Projekt mit vielen JS, aber keine Komponententests, und wir versuchen, die Testabdeckung zu erhöhen. Ich hätte gerne einen Deckungsbericht, der für die meisten unserer Dateien eine Abdeckung von 0% anzeigt, aber im Laufe der Zeit einen steigenden Deckungsprozentsatz aufweisen wird.

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

Ich weiß, dass Sie Sie Problem behoben haben, aber meine Antwort überprüfen, es scheint, dass sie eine einfachere Methode direkt in Schluck-Istanbul hinzugefügt haben. Vielleicht lohnt es sich, es auszuprobieren/bestätigen, dass es die gleichen Ergebnisse liefert. –

Antwort

3

die Abdeckung in allen Dateien zeigen Sie 2 Dinge tun müssen:

im Projekt
  • Alle Dateien sollten im [my source glob] enthalten sein.

  • Alle Dateien müssen benötigt werden, mit anderen Worten, die require() muss für alle Dateien im Projekt aufgerufen werden, weil Istanbul wahrscheinlich den Standardwert require() ändert, um die Abdeckung in einer Datei zu berechnen.

Sie können so etwas wie dies zu Beginn der Testdatei schreiben:

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

Sie require-dir dafür verwenden können.

Und statt:

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

Istanbul Haken ausgeführt wird, wenn die Datei benötigt wird. Sie müssen also alle Dateien anfordern, damit sie in den endgültigen Deckungsbericht aufgenommen werden können. Sie können dies erreichen, indem er einen Hahn in Ihrem schluck Aufgabe Injektion und auf alle ausgewählten Dateien rufen erfordern:

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

das funktioniert super - nur müssen Schluck-Tap – vadimich

+0

Schluck-Tipp löst diesen Fehler 'keine writecb in Transform Klasse 'und ich kann nicht herausfinden, warum. Der Rest des Codes funktioniert perfekt. Irgendeine Idee? –

14

Es ist eigentlich viel einfacher und Sie haben nur includeUntested zu Ihrem istanbul() Gespräch hinzuzufügen.

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'} 
      })); 
     }); 
    }); 

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

+0

Ein kritischer Teil, den ich mit dieser Antwort gefunden habe, ist die Tatsache, dass du gulp.src zurückbringst (...). – axlj

+0

@axlj Soweit ich mich erinnere, denke ich, es ist nur um zu helfen, die Zeit zu berechnen, die es braucht, um jede Aufgabe auszuführen.Sonst endet man mit Dingen wie "Test beendet nach 3 μs" –

4

Ich habe mit diesem heute zu kämpfen und hat keine Antworten auf Google. Ich habe schließlich eine Antwort gefunden, die einer Antwort sehr ähnlich ist, aber der Aufruf writeReports muss vor dem Aufruf von mocha gehen.

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' 
     })); 
    }); 
}); 

Es gibt ein Ticket im Zusammenhang mit dieser ist, die ich vor einigen Voodoo-Zauber nur in den großen Schluck-istanbul Code verwiesen gefunden Dinge funktionieren: https://github.com/gotwarlost/istanbul/issues/112

+0

Sie hätten zu dieser Antwort kommentieren können – chouaib

+1

@chouaib eine vollständige Antwort wie diese passt nicht und gehört nicht zu einem Kommentar. –

+0

Für alle anderen, die mit dieser Antwort kämpfen und gulp-mocha 4.0.x +, sollten Sie 'gulp.src (...)' zurückgeben und das 'finish' -Ereignis anhören. – axlj