概要
Laravel5.4環境で、自動テストのカバレッジを計測する要件があったので、
開発環境にXdebugを入れる作業のメモを残しておきます。
そもそもカバレッジとは
下記サイトの説明からすると
テストを実行したときに、実装コードのどの部分が実行されたかを調べるものです。
PHPUnit のコードカバレッジ解析では PHP_CodeCoverage コンポーネントを使っています。
このコンポーネントは、 Xdebug 拡張モジュールが提供するステートメントカバレッジ機能を利用しています。
なるほど、PHP7であれば、phpdbgなどでいけるかも・・・
とりあえず、PHP5.6の環境で試しているため、無難にx-debugで今回はやってみます。
DockerのPHPコンテナを起動
公式コンテナを使って起動します。
docker-composeの設定ファイル(yaml)を作成する
version: '2'
services:
php:
image: php:5.6-fpm
container_name: 'php'
ports:
- '9000:9000'
設定ファイルを使ってコンテナを起動する。
$ docker-compose up -d
DockerのPHPコンテナにXdebugをインストールする
xdebugは、常時起動していると重たいので、
あえてインストールしたコンテナは作らず、追加でインストールすることにします。
コンテナへ接続する。
$ docker exec -it php bash
x-debugをインストールする (有効化はしない)
# pecl install xdebug
下記コマンドで拡張を有効化できるがあえて実行しない
※ 常時有効化したい方はどうぞ
※ ここでは、カバレッジ計測時のみx-debugをONにするので、常時有効化はしません。
# docker-php-ext-enable xdebug
x-debugの設定ファイル
x-debugの設置ファイルを作成する。
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
; port 9000 is used by php-fpm
xdebug.remote_port=9000
xdebug.remote_autostart=1
; no need for remote host
xdebug.remote_connect_back=1
xdebug.idekey="PHPSTORM"
xdebug.profiler_enable=0
xdebug.remote_host=10.254.254.254
docker-compose.ymlに読み込みを追加する。
version: '2'
services:
php:
image: php:5.6-fpm
container_name: 'php'
ports:
- '9000:9000'
volumes:
- ./xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
コンテナを再起動する。
$ docker-compose restart
composerスクリプトとしてコマンド設定
composer.jsonを修正してスクリプトを追加します。
{
"scripts" :{
"test":"./vendor/bin/phpunit --colors=always",
"coverage": ["php -dzend_extension=xdebug.so ./vendor/phpunit/phpunit/phpunit --coverage-text --coverage-html=storage/coverage/html --colors=never"],
}
}
テストコマンドとして以下の2つを設定します。
- 通常のテストコマンド
$ php composer.phar test
- カバレッジの計測を行うテストコマンド(この時だけx-debugをONにする)
$ php composer.phar coverage
phpunit.xmlについて
下記の記載だと毎回coverageの計算が入って遅くなるので、採用しない
<logging>
<log type="coverage-clover" target="coverage/clover.xml"/>
<log type="coverage-html" target="coverage/html"/>
</logging>
テスト実行
下記のコマンドでそれぞれ実行可能です。
※ coverageコマンドは、単純にテストするより時間がかかります
※ テスト作成中などにテストが通るか確認したい場合は、testコマンドを推奨します
$ php composer.phar test
$ php composer.phar coverage
一部のクラスやメソッドのみ実行したい場合
# ./tests/Feature/HelperTest.phpのテストだけを実行
$ php composer.phar test -- --filter=HelperTest
# ./tests/Feature/HelperTest.phpのtestIndexメソッドだけを実行
$ php composer.phar test -- --filter='HelperTest::testIndex'