#はじめに
前回記事にしたように、テストファーストで開発を行っていく準備はできました。
しかしながら、現状ではどの部分までテストを行っているのか、またテスト対象コードのどの部分をテストしていないのかがよくわからないような状態です。
テスト対象が膨大になっていくにつれ、テスト漏れが発生していないか確認したいと思うのは誰しも同じなのではないでしょうか。
ということで何かいい方法がないか調べてみたところ、Coverageとかいうステキなモノがあることがわかりました。早速導入。
あ、念のため環境を説明しとくと、Homestead+Vagrantで仮想化した状態で、仮想マシン側からユニットテストしているような状態です。
#手順
今回は次の部分をいじいじします。
- phpunit.xml
- (Homestead内)/etc/php/7.1/fpm/conf.d/20-xdebug.ini
- (Homestead内)/etc/php/7.1/fpm/php.ini (+/etc/php/7.1/cli/php.ini)
##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本家様をご参照ください。
本当は<whitelist>~</whitelist>
部分でテスト対象のディレクトリを絞り込んだりしてやるといいみたいですが、今回は省略。
#テスト実行…?
ここでテストを実行しようとすると、
The Xdebug extension is not loaded.
No code coverage will be generated.
このようなエラーが発生するかもしれません。次の手順で対応しましょう。
どーもXdebugとPHPUnitの紐付け的なものができてなくて、モノ自体はあるのにログ吐けませんよーって言ってるみたいです。
#Homestead内設定ファイル修正
以降の作業はvagrant ssh
かなんかで接続して、仮想マシン側で行います。
まずは例によってphphinfo();
の値を見てみましょう。
今回はこんな感じの構成でした。
##/etc/php/7.1/fpm/conf.d/20-xdebug.ini
続いてxdebugの設定をコピーしましょう。
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ブラウザで確認します。
パッと見でどこがどんな感じかわかるスグレモノ。
更に辿っていくと...。
コードが表示されます。
グリーンがテスト済みのコード、レッドが未テストのコードだそうです。
こ...これはすごい...!
視覚的にもわかりやすくテストを実行できますし、継続的な保守も簡単に行えそうですね。
ここまで来ると俄然コントローラーからサービスクラスへ移行してテストしやすくしたり、Mockeryを利用してなんかしたくなりますね。
#参考文献