GitHub に公開した Node.js スクリプトに Travis CI を導入し Coveralls でカバレッジ管理するまで

GitHub に httpreqtest という Node.js で動くクライアントのHTTPリクエスト内容を JSON でそのまま返すスクリプトを公開した。非公開のトリッキーな仕様の API サービスに対して、クライアントを作るにあたり、実装チェックする必要があり勢いで作った。

このリポジトリ tilfin/httpreqtest · GitHub に build pass と coverage バッジを付けたいと思い、Travis CI を導入しテストを走らせ、Coveralls でコードのカバレッジが表示できるようにしたので、それをメモしておく。

テスト

まずテストがなければ始まらないので、MochaSuperTest を使ってテストを書いた。 mocha と supertest を npm でインストールし、package.json の devDependencies に保存する。

$ npm install mocha --save-dev

test ディレクトリを掘り、その中にテストコードを書いた jsファイルを置く。 package.jsonscripts には { "test": "mocha" } と記述して、npm test で実行されるようになる。

Travis CI

ブラウザから Travis CI に GitHub アカウントでサインインする。リポジトリ一覧から当該のものをオンにする。これだけ諸々の設定が済みます。 あと、Git リポジトリのルートに .travis.yml を置きます。

.travis.yml
language: node_js
node_js:
  - "0.10"

上記をコミットしてプッシュして、Travis CI をブラウザで開いていると、ビルドおよびテストが実行されます。正常に終了すれば念願の build pass バッジになります。これを README.md に追加しておきましょう。

Travis CI - Free Hosted Continuous Integration Platform for the Open Source Community

コードカバレッジ

コードカバレッジについては、先に Coveralls - Test Coverage History & Statistics でセットアップドキュメントを参考する方が良いかもしれない。

最終的に cainus/node-coveralls · GitHub を参照することになる。ここの手順に沿って、

npm install coveralls --save-dev
npm install mocha-lcov-reporter --save-dev

Mocha を利用しているの後者を入れたが、後述する Istanbul を利用する際には不要かもしれない。

ここで、カバレッジ測定ツールとして、Blanket.js、JSCoverage を試したがそもそもうまくいかなかった。結局3番目に紹介されている gotwarlost/istanbul · GitHub を試したら、すんなり上手くいったのでこちらを使った。

$ npm install istanbul --save-dev

単にローカルでカバレッジを測定するだけなら、下記で実行できる。

$ ./node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha

ローカルの

$ ./node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage

このようにコマンドが長い(手続きが複数に渡る)ので、見通しやすくするため、Make を導入する。 またカバレッジ測定時にテストも走るため処理を軽くするため、 * テスト実行時にカバレッジ測定も行い * カバレッジ情報を Coveralls に送る の2つに分ける。

Makefile
mocha=./node_modules/mocha/bin/_mocha
istanbul=./node_modules/.bin/istanbul

test-cov: clean
  $(istanbul) cover $(mocha) -- -R spec test/*

coveralls: 
  cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js;

clean:
  rm -fr coverage

Travis CI では上記の Make 処理を呼ぶために、script に make test-cov を成功時に実行される after_success に make coveralls と make clean を呼ぶようにした。

.travis.yml
language: node_js
node_js:
  - "0.10"
script: 'make test-cov'
after_success: 'make coveralls; make clean'

ここではまたプッシュはしない。

Coveralls

ブラウザから CoverallsGitHub アカウントでサインインする。 ADD REPO ボタンからリポジトリを登録するだけ、ほとんど Travis CI と同じだ。 ようやく準備完了で .travis.yml の変更をプッシュする。

GitHub でのプッシュがフックされ、Travis CI にてビルドとテストが走ります。さらに Coveralls にカバレッジ結果が送られます。Travis CI、Coveralls 両方ともブラウズでリアルタイムに進行を確認できます。

tilfin/httpreqtest | Coveralls - Test Coverage History & Statistics

最後に Coveralls のカバレッジバッジを README.md に追加して終わり。

tilfin/httpreqtest · GitHub のようにバッジで状態が表示されます。