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

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

## そもそもカバレッジとは
下記サイトの説明からすると

* [コードカバレッジ解析](https://phpunit.de/manual/current/ja/code-coverage-analysis.html) 

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

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

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

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

```yaml:docker-compose.yml
version: '2'
services:
 php:
  image: php:5.6-fpm
  container_name: 'php'
  ports:
   - '9000:9000'
```
設定ファイルを使ってコンテナを起動する。

```sh:ターミナル
$ docker-compose up -d
```

## DockerのPHPコンテナにXdebugをインストールする

xdebugは、常時起動していると重たいので、
あえてインストールしたコンテナは作らず、追加でインストールすることにします。

コンテナへ接続する。

```sh:ターミナル
$ 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に読み込みを追加する。

```yaml: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
```

コンテナを再起動する。

```sh:ターミナル
$ docker-compose restart
```

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

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

```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"],
    }
}
```

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

* 通常のテストコマンド

```sh:ターミナル
$ php composer.phar test
```

* カバレッジの計測を行うテストコマンド（この時だけx-debugをONにする）

```sh:ターミナル
$ php composer.phar coverage
```

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

```xml:phpunit.xml
    <logging>
        <log type="coverage-clover" target="coverage/clover.xml"/>
        <log type="coverage-html" target="coverage/html"/>
    </logging>
```

## テスト実行
下記のコマンドでそれぞれ実行可能です。
※ coverageコマンドは、単純にテストするより時間がかかります
※ テスト作成中などにテストが通るか確認したい場合は、testコマンドを推奨します

```sh:ターミナル
$ php composer.phar test
$ php composer.phar coverage
```

一部のクラスやメソッドのみ実行したい場合

```sh:ターミナル
# ./tests/Feature/HelperTest.phpのテストだけを実行
$ php composer.phar test -- --filter=HelperTest

# ./tests/Feature/HelperTest.phpのtestIndexメソッドだけを実行
$ php composer.phar test -- --filter='HelperTest::testIndex'
```

## 参考サイト
- [Docker + xdebug](http://blog.arroyolabs.com/2016/10/docker-xdebug/)
- [arroyolabs-blog/docker-xdebug](https://github.com/arroyolabs-blog/docker-xdebug/tree/master/xdebug_56/docker)
- [コマンドラインのテストランナー](https://phpunit.de/manual/current/ja/textui.html)
- [必要な時にのみxdebugをオン](https://qiita.com/koriym/items/29f81514706a39e3b7c1) (オススメ)
- [Laravel5.4: テストの基本](https://qiita.com/sutara79/items/f8c8313c97ce4d2febc2)
- [[Laravel]はじめてのUnitTest](https://atuweb.net/201612_laravel-test-1ststep/)
- [PHPUnitでカバレッジテストをやってみる](http://hamuhamu.hatenablog.jp/entry/2015/05/27/005650)
- [Scripts - Composer](https://getcomposer.org/doc/articles/scripts.md#writing-custom-commands)