[Laravel5.1]テスト結果のCoverageを確認してテスト漏れをなくそう

#はじめに
[前回](http://qiita.com/tosite0345/items/51a51b9b32b305f4fba2)記事にしたように、テストファーストで開発を行っていく準備はできました。
しかしながら、現状ではどの部分までテストを行っているのか、またテスト対象コードのどの部分をテストしていないのかがよくわからないような状態です。
テスト対象が膨大になっていくにつれ、テスト漏れが発生していないか確認したいと思うのは誰しも同じなのではないでしょうか。

ということで何かいい方法がないか調べてみたところ、Coverageとかいうステキなモノがあることがわかりました。早速導入。

あ、念のため[環境を説明しとくと](http://qiita.com/tosite0345/items/2e5143ee2b7bb31f2ffb)、Homestead＋Vagrantで仮想化した状態で、仮想マシン側からユニットテストしているような状態です。

#手順
今回は次の部分をいじいじします。

+ [phpunit.xml](#phpunitxml)
+ (Homestead内)[/etc/php/7.1/fpm/conf.d/20-xdebug.ini](#etcphp71fpmconfd20-xdebugini)
+ (Homestead内)[/etc/php/7.1/fpm/php.ini (+/etc/php/7.1/cli/php.ini)](#etcphp71fpmphpini)

##phpunit.xml
```xml:phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
    ...
    <logging>
        <log type="coverage-html" target="./report" charset="UTF-8"
             yui="true" highlight="true"
             lowUpperBound="50" highLowerBound="80" />
    </logging>
</phpunit>
```

内部的なところは省略させていただきます。
重要なのは``<logging>～</logging>``部分です。
logファイルの詳しい記述は[PHPUnit本家様](https://phpunit.de/manual/current/ja/appendixes.configuration.html)をご参照ください。
本当は``<whitelist>～</whitelist>``部分でテスト対象のディレクトリを絞り込んだりしてやるといいみたいですが、今回は省略。

#テスト実行…？
ここでテストを実行しようとすると、

```
The Xdebug extension is not loaded.
No code coverage will be generated.
```

このようなエラーが発生するかもしれません。次の手順で対応しましょう。
どーもXdebugとPHPUnitの紐付け的なものができてなくて、モノ自体はあるのにログ吐けませんよーって言ってるみたいです。

#Homestead内設定ファイル修正
以降の作業は``vagrant ssh``かなんかで接続して、仮想マシン側で行います。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/165355/63c0400a-c022-2fde-020e-de6946e36011.png)
まずは例によって``phphinfo();``の値を見てみましょう。
今回はこんな感じの構成でした。

##/etc/php/7.1/fpm/conf.d/20-xdebug.ini
続いてxdebugの設定をコピーしましょう。

```ini:/etc/php/7.1/fpm/conf.d/20-xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.max_nesting_level = 512
```

こんな感じ。

##/etc/php/7.1/fpm/php.ini
コピーしたテキストを``/etc/php/7.1/fpm/php.ini``の最下部に貼り付け。
念のためテキストサーチして、xdebugの設定が既に記述されていないかだけチェック。
~~まー多分``/etc/php/7.1/cli/php.ini``の設定は変えなくていいんでしょうが、念のためこちらも変更してます。~~
**[2017-10-30追記]**
コメントにて、``/etc/php/7.1/fpm/php.ini``だけだとphpUnit側でテストが通らないという指摘をいただきました。
詳細な原因については不明ですが、想定されることとして「実行環境では``/etc/php/7.1/fpm/php.ini``を見ているが、phpUnitテストでは``/etc/php/7.1/cli/php.ini``を見ている」ことが原因ではないかと。
（実行環境ではApacheなりnginXなりを通してphpファイルを実行しているが、テスト環境ではローカルでphpファイルを実行している？）
ここに追記をすると問題なく動作したとの報告を受けていますので、``/etc/php/7.1/fpm/php.ini``と``/etc/php/7.1/cli/php.ini``、どちらも修正をするようにお願いいたします。

##仮想マシン再起動
おそらくそのままでは設定が反映されないので、仮想マシンを``vagrant reload``で再起動。
どうでもいいけどrestartじゃなくてreloadなのが地味ーに引っかかる。

#ログ確認
##テスト実行
ルートディレクトリで``./vendor/bin/phphunit``を実行。
問題なければ``Generating code coverage report in HTML format ... done``のメッセージが表示されるはずです。

##Coverageファイル確認
ルートディレクトリ直下に新しく``report``ディレクトリが生成されるはずなので、内容をWebブラウザで確認します。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/165355/2d65781f-33a9-752b-171d-0c3622ccf7be.png)

パッと見でどこがどんな感じかわかるスグレモノ。
更に辿っていくと...。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/165355/0c6003bf-c1c7-4b81-ad79-6e9877465a4d.png)

コードが表示されます。
グリーンがテスト済みのコード、レッドが未テストのコードだそうです。
こ...これはすごい...！

視覚的にもわかりやすくテストを実行できますし、継続的な保守も簡単に行えそうですね。
ここまで来ると俄然コントローラーからサービスクラスへ移行してテストしやすくしたり、Mockeryを利用してなんかしたくなりますね。

#参考文献
+ [Setting Up Xdebug With Laravel Homestead and PhpStorm](https://edcs.me/blog/setting-up-xdebug-with-phpstorm-and-laravel-homestead/)
+ [PHPUnitの設定は正しくしよう](http://blog.comnect.jp.net/blog/123)
+ [[Laravel]はじめてのUnitTest](http://atuweb.net/201612_laravel-test-1ststep/)