gulpを使ってphpunitを自動化したときにハマったこと


概要

vim使いながらもphpの開発を効率化したい!
コード修正してphpunitを動かすのが、ダルいなぁーと思って、gulpを使って自動化してみました。

要件

開発しながら、動的に何回でもテストが実行される環境を作りたい。

今回躓いた点

なぜか一度phpunitが実行されると、2回目以降phpunitが実行されない。
gulp-plumberを使ったりする記事は見かけて試したりはしてみたのですが、
うまくいかず。。。
きっともっと良い解決策があるかもなのですが、同じような問題で躓いた方がいたらと思い、
投稿させていただきます。

環境

php -version
PHP 7.1.23 (cli) (built: Nov  7 2018 18:20:35) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

node --version
v11.12.0

準備

必要なmodule入れる

npm i --save gulp gulp-notify gulp-phpunit

gulpfile.jsを書く

'use strict';
var gulp = require('gulp');
var notify = require('gulp-notify');
var phpunit = require('gulp-phpunit');

gulp.task("test",function(){
    gulp.src('tests/*.php')
        .pipe(phpunit('vendor/bin/phpunit'))
        .on('error', notify.onError({
            title: "Gulp PHP Unit",
            message: "Error(s) occurred during testing..."
        }))
        .pipe(notify({
            title: "Gulp PHP Unit",
            message: 'Successfully ran test!'
        }));
});

gulp.task('watch',function(){
    gulp.watch(['src/**/*.php', 'tests/**/*.php'], gulp.task('test'));
});

実行

gulp watch

結果

画質荒くてすみません。。。(テストコードを書き換えたときにphpunitが動くことを確認しています)

問題点

一回テスト実行するとそこで止まってしまう。。。
これだと、やりたいこととは違うんだ。。。
やりたいのは、開発しながら、何回でもphpunitを実行してくれる感じ。

解決策

chokidarを使う
です。

chokidarのinstall

npm i --save chokidar

gulpfile.jsの修正

'use strict';
var gulp = require('gulp');
var chokidar = require('chokidar');
var notify = require('gulp-notify');
var phpunit = require('gulp-phpunit');

var watcher = chokidar.watch(['src/**/*.php', 'tests/*.php']);

watcher.on('change', function(){
    gulp.src('tests/*.php')
        .pipe(phpunit('vendor/bin/phpunit'))
        .on('error', notify.onError({
            title: "Gulp PHP Unit",
            message: "Error(s) occurred during testing..."
        }))
        .pipe(notify({
            title: "Gulp PHP Unit",
            message: 'Successfully ran test!'
        }));
});

実行

node gulpfile.js

結果

2回目以降の修正でもちゃんとphpunitが実行されるようになった!

github

下記のリポジトリにソースを載せています。
phpunit-gulp

phpのコードとテストコードは、sampleとして下記のコードを使っています。
phpunit

参考資料

phperだってgulp使おうぜ!
gulp
chokidar