コンテナでphpunit環境を用意してホストOSのコマンドラインからテストを実行する
PHPIntelephenseを使って開発をする場合、PHPの実行環境をホストマシン上に用意する必要が無いことに気が付いたので
PHPUnitをコンテナで用意することにしました。(PHP IntelliSenseだとphp7.1以上が必要)
尚、本記事ではPHPUnitの使い方については解説しません。
phpunitコンテナの使い方
イメージの準備
phpunit公式がコンテナイメージを公開しています。
イメージを取得します。
$ docker pull phpunit/phpunit
バージョンを指定したいときはこのようにしましょう。
$ docker pull phpunit/phpunit:5.0.4
実行
プロジェクトルートでdocker runします。
$ docker run -v $(pwd):/app --rm phpunit/phpunit /app/tests
カレントディレクトリをコンテナ内の/appにマウントするので
上記の例だと/tests配下のテストコードが実行されます。
ハマりポイント
$ docker run -v $(pwd):/app --rm phpunit/phpunit /app
上記のようにプロジェクト内のすべてのテストを実行しようとして下記のエラーが出ました。
PHP Fatal error: Class 'PHPUnit_Framework_TestCase' not found
これはcomposerで入れた何らかのパッケージに含まれているテストとコンテナ内のPHPUnitのバージョンが一致していないから起きているっぽいです。
明示的にテストを指定しても同様のエラーが出る場合はPHPUnitの使い方が間違っていると思われるので、テストコードを確認しましょう。
コマンドラインから手軽に実行する
コンテナでテストを実行できるようになったのは良いものの、このままでは使い勝手が悪いので端末に設定をします。
function phpunit ($dir) {
docker run -v $(PWD):/app --rm phpunit/phpunit $dir
}
これでphpunit /app/testsとコマンドを打てばPHPUnitを実行できます。
現状イマイチなところ
実行結果を色付できない
通常PHPUnitの実行結果は下記のように色付けされて出力されます。
しかしコンテナを利用すると色をつけられないので見た目がちょっと寂しいです。
(コンテナの標準出力に色をつける方法は普通にありそうな気がする)
各種拡張が入ってない
例えばテストフィクスチャでoracleのデータベースを操作する必要がある場合はoci8が必要になります。
別途dockerfileを書いた上で、上記の設定をしなきゃいけないのでちょっと面倒です。
感想
これまではvim拡張を頑張ったvscodeのremote containerを使ってコンテナにアタッチして開発をしてきましたが、これを機にvimを使った開発スタイルに移行していきたいです。
Discussion