PHPコンテナ(Docker) + xdebug でカバレッジ計測

  • 2
    いいね
  • 0
    コメント

概要

Laravel5.4環境で、自動テストのカバレッジを計測する要件があったので、
開発環境にXdebugを入れる作業のメモを残しておきます。

そもそもカバレッジとは

下記サイトの説明からすると

テストを実行したときに、実装コードのどの部分が実行されたかを調べるものです。
PHPUnit のコードカバレッジ解析では PHP_CodeCoverage コンポーネントを使っています。
このコンポーネントは、 Xdebug 拡張モジュールが提供するステートメントカバレッジ機能を利用しています。

なるほど、PHP7であれば、phpdbgなどでいけるかも・・・
とりあえず、PHP5.6の環境で試しているため、無難にx-debugで今回はやってみます。

DockerのPHPコンテナを起動

公式コンテナを使って起動します。

docker-composeの設定ファイル(yaml)を作成する

docker-compose.yml
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をインストールする (有効化はしない)

phpコンテナ
# pecl install xdebug

下記コマンドで拡張を有効化できるがあえて実行しない
※ 常時有効化したい方はどうぞ
※ ここでは、カバレッジ計測時のみx-debugをONにするので、常時有効化はしません。

phpコンテナ
# docker-php-ext-enable xdebug

x-debugの設定ファイル

x-debugの設置ファイルを作成する。

./xdebug.ini
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に読み込みを追加する。

docker-compose.yml
version: '2'
services:
 php:
  image: php:5.6-fpm
  container_name: 'php'
  ports:
   - '9000:9000'
  volumes:
   - ./xdebug.ini:/etc/xdebug.ini

コンテナを再起動する。

ターミナル
$ docker-compose restart

composerスクリプトとしてコマンド設定

composer.jsonを修正してスクリプトを追加します。

composer.json
{
    "scripts" :{
        "test":"./vendor/bin/phpunit --colors=always",
        "coverage": ["php -dzend_extension=xdebug.so ./vendor/bin/phpunit --coverage-text --coverage-html=storage/coverage/html --coverage-clover=storage/coverage/clover.xml"],
    }
}

テストコマンドとして以下の2つを設定します。

  • 通常のテストコマンド
ターミナル
$ php composer.phar test
  • カバレッジの計測を行うテストコマンド(この時だけx-debugをONにする)
ターミナル
$ php composer.phar coverage

phpunit.xmlについて

下記の記載だと毎回coverageの計算が入って遅くなるので、採用しない

phpunit.xml
    <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'

参考サイト