LoginSignup
9
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-08

概要

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:/usr/local/etc/php/conf.d/xdebug.ini

コンテナを再起動する。

ターミナル
$ docker-compose restart

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

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

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の計算が入って遅くなるので、採用しない

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'

参考サイト

9
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
16