2014/02/04

gulp-istanbulとJenkinsを使ってテストのカバレッジを集計できるようにする

前回の記事「Safx: gulp-mochaのテスト結果をJenkinsで集計できるようにする」ではgulp-mochaを使って、テスト結果をJenkinsで集計できるようにしました。

今回はgulp-istanbulを使ってテストのカバレッジを集計できるようにします。

gulp-istanbulの導入とタスクの追加

まず、gulp-istanbulを導入します。

$ npm install --save-dev gulp-istanbul

あとは、gulpfile.coffeeでパッケージを読み込んで、タスクを追加するだけです。

istanbul = require 'gulp-istanbul'

# cover
gulp.task 'cover', ->
  gulp.src ['lib/*.js']
    .pipe istanbul()
    .on 'end', ->
      gulp.src ['lib/*.js', 'test/*.coffee']
        .pipe mocha()
        .pipe istanbul.writeReports 'coverage'

これで、gulp coverでテストカバレッジを取得できるようになります。

$ gulp cover
[gulp] Using file /Users/safx/src/.jenkins/workspace/Sample/gulpfile.js
[gulp] Working directory changed to /Users/safx/src/.jenkins/workspace/Sample
[gulp] Running 'cover'...
[gulp] Finished 'cover' in 27 ms

  3 passing (3ms)

----------------+-----------+-----------+-----------+-----------+
File            |   % Stmts |% Branches |   % Funcs |   % Lines |
----------------+-----------+-----------+-----------+-----------+
   lib/         |       100 |     85.71 |       100 |       100 |
      sample.js |       100 |     85.71 |       100 |       100 |
----------------+-----------+-----------+-----------+-----------+
All files       |       100 |     85.71 |       100 |       100 |
----------------+-----------+-----------+-----------+-----------+

=============================== Coverage summary ===============================
Statements   : 100% ( 6/6 )
Branches     : 85.71% ( 6/7 )
Functions    : 100% ( 2/2 )
Lines        : 100% ( 6/6 )
================================================================================

$ ls coverage 
lcov-report/    lcov.info

なお、open coverage/lcov-report/index.htmlで、HTML形式のリポートを見ることもできます。 Jenkinsを利用しないのなら、こちらを利用するとよいでしょう。

lcov_cobertura.pyの取得

gulp-istanbulで得られるファイルは、そのままではJenkinsで利用できません。

そこで、Coberturaプラグインで扱える形式に変換するために、 「lcov to Cobertura XML Converter (lcov_cobertura.py)」を利用します。

もし、lcov_cobertura.pyを単体で利用するなら、次のようになります。

curl -O https://raw.github.com/eriwen/lcov-to-cobertura-xml/master/lcov_cobertura/lcov_cobertura.py
python lcov_cobertura.py coverage/lcov.info

これで、Coberturaプラグインで利用可能なcoverage.xmlというファイルが作成されます。

Jenkins

Jenkinsでは上のlcov_cobertura.pyを使うように「シェルの実行」と「Coberturaカバレッジ・レポートの集計」で次のように書くだけです。

gulp cover
python lcov_cobertura.py coverage/lcov.info

これで、ビルド実行するとコードカバレッジが表示されるようになります。

おわりに

gulp-istanbulとJenkinsを使ってテストのカバレッジを集計できるようにしました。

gulpのタスクで、testとcoverのコードがDRYでないのが、どうにかしたいところです。

gulpfile.coffee

# base
gulp = require 'gulp'
gutil = require 'gulp-util'

# misc
cond  = require 'gulp-if'
clean = require 'gulp-clean'

# compilers
uglify = require 'gulp-uglify'
lsc    = require 'gulp-livescript'
coffee = require 'gulp-coffee'

# test tools
mocha = require 'gulp-mocha'
istanbul = require 'gulp-istanbul'

isRelease = gutil.env.release?


# compile
gulp.task 'script', ->
  gulp.src 'src/**/*.ls'
    .pipe lsc() .on 'error', gutil.log
    .pipe cond isRelease, uglify()
    .pipe gulp.dest 'lib'

gulp.task 'watch', ->
  gulp.watch 'src/**/*.ls', ['script']

gulp.task 'clean', ->
  gulp.src 'lib/*.js', {read:false}
    .pipe clean()


# test
gulp.task 'test', ['script'], ->
   gulp.src ['lib/*.js', 'test/*.coffee']
     .pipe mocha {reporter: 'xunit-file'}

# cover
gulp.task 'cover', ->
  gulp.src ['lib/*.js']
    .pipe istanbul()
    .on 'end', ->
      gulp.src ['lib/*.js', 'test/*.coffee']
        .pipe mocha()
        .pipe istanbul.writeReports 'coverage'

gulp.task 'default', ['script', 'watch']

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。