読者です 読者をやめる 読者になる 読者になる

gulpを利用してmochaで書かれたテストを実行する

プログラム

定例の2周り遅れエントリ。Castoや、STORYBOARDSではtask runnerにGruntを利用していたのですが、glupも触ってみようということで使ってみました。

最近はnode.jsでちょっとしたツールを書いていたりすることが多く、そのテストにmochaを使って書いていたりするので試しにその実行のタスクをglupで書いてみることにしました。

まずは、glupのインストール。globalで入れてコマンドラインから叩ける様にします。

$ npm install -g gulp
$ gulp -v
[19:28:32] CLI version 3.8.8
[19:28:32] Local version undefined

実際にgulpを使いたいプロジェクトに入って、プロジェクト直下にもインストールします。

$ cd project
$ npm install gulp --save-dev
$ gulp -v
[19:30:00] CLI version 3.8.8
[19:30:00] Local version 3.8.8

更にmochaのテストをgulpで実行させるために、gulp-mocha等々入れます。

$ npm install gulp-mocha --save-dev
$ npm install gulp-util --save-dev

これで準備ができたので、プロジェクト直下に gulpfile.js を作成します。今回は、

  • mochaのテストを実行するタスク
  • libディレクトリまたはtestディレクトリ以下を監視して、ファイルに変更があればそのmochaのテストを実行するタスクを呼び出すというタスク

の2つを書いてみます。ほぼサンプルそのままですが...。

var gulp = require('gulp');
var mocha = require('gulp-mocha');
var gutil = require('gulp-util');

gulp.task('mocha', function() {
  return gulp.src(['test/*.js'], { read: false })
    .pipe(mocha({ reporter: 'list'}))
    .on('error', gutil.log);
});

gulp.task('watch-mocha', function() {
    gulp.watch(['lib/**', 'test/**'], ['mocha']);
});

こうすることで、mochawatch-mocha というタスクが作成されました。まずシンプルにテストを実行するには、プロジェクトルートで

$ gulp mocha
[19:35:25] Using gulpfile ~/project/gulpfile.js
[19:35:25] Starting 'mocha'...

  ․ test A : 16ms

(snip)

  5 passing (29ms)

[19:35:25] Finished 'mocha' after 397 ms

とgulpを利用してmochaのテストを実行できます。もうひとつ作成している watch-mocha というタスクを実行すると

[19:37:58] Using gulpfile ~/project/gulpfile.js
[19:37:58] Starting 'watch-mocha'...
[19:37:58] Finished 'watch-mocha' after 9.99 ms

と表示され待機状態になるので、gulpfile.js 上で指定したlib及びtestディレクトリ以下のファイルを編集して保存すると自動的に変更が検出されたタイミングでmochaのテストが実行されます。

[19:37:58] Using gulpfile ~/project/gulpfile.js
[19:37:58] Starting 'watch-mocha'...
[19:37:58] Finished 'watch-mocha' after 9.99 ms
[19:39:32] Starting 'mocha'...

  ․ test A : 16ms
(snip)

もっとも、この程度のタスクの大きさだとあんまりメリット感じられないのですが、gulpfile.js

gulp.src(['test/*.js'], { read: false }).pipe(mocha({ reporter: 'list'})).on('error', gutil.log);

のくだりの手続き的に書いていくやり方はわかりやすい気もしたり。もう少しあれこれ触っていこうかと思います。