2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-22

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

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

あ、念のため環境を説明しとくと、Homestead+Vagrantで仮想化した状態で、仮想マシン側からユニットテストしているような状態です。

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

##phpunit.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本家様をご参照ください。
本当は<whitelist>~</whitelist>部分でテスト対象のディレクトリを絞り込んだりしてやるといいみたいですが、今回は省略。

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

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

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

#Homestead内設定ファイル修正
以降の作業はvagrant sshかなんかで接続して、仮想マシン側で行います。
001.png
まずは例によってphphinfo();の値を見てみましょう。
今回はこんな感じの構成でした。

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

/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

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

003.png

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

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

#参考文献

2
6
2

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
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?