[PHP] ゼロから始める PHPUnit + CI (3. コードカバレッジを計測しよう)


目次

  1. PHPUnit を導入しよう
  2. CI環境を導入しよう
  3. コードカバレッジを計測しよう(本記事)

はじめに

この記事の目的や環境情報は最初の記事を参照。

3. コードカバレッジを計測しよう

コード網羅率 - Wikipedia

せっかくユニットテストとCI環境が整っていても、テストの網羅率が低いとほとんど意味をなさないし、網羅性を上げることがテストコードを書くモチベーションアップの一環になったりする(100%にしたほうがいいって話じゃない)。

今回は Coveralls というサービスを利用して、カバレッジレポートを表示。
最終的に以下のような流れになる。

  1. GitHub に Push
  2. TravisCI で PHPUnit 実行
  3. PHPUnit で カバレッジレポートXMLを出力
  4. TravisCI 終了時に Coveralls のAPIに対してレポートXMLを送信

3.1 ローカルにレポートを出力しよう

COMMIT: 3.1 ローカルにレポートを出力しよう

まずはカバレッジレポートってどんなん?ってことで前段としてローカルに出力してみる。

Xdebugの導入

PHPUnit でカバレッジの計測には Xdebug 拡張が必要になる。
インストール方法は各環境で違うので割愛。

$ php -v
PHP 7.1.0 (cli) (built: Dec  2 2016 05:24:39) ( NTS MSVC14 (Visual C++ 2015) x64 )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

こんな感じで with Xdebug と出てくればOK。

設定ファイルに追記

phpunit.xml.dist
 phpunit.xml.dist | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 931bdfb..864be6f 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -5,4 +5,14 @@
     <testsuite name="Application Test">
         <directory>./tests/src/</directory>
     </testsuite>
+
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">./src</directory>
+        </whitelist>
+    </filter>
+
+    <logging>
+          <log type="coverage-html" target="./report" lowUpperBound="35" highLowerBound="70"/>
+    </logging>
 </phpunit>

設定ファイルに下記の内容を追記した。

  • filter でカバレッジ対象のソースを ./src 以下に指定
  • ./report に html形式でカバレッジレポートを出力 (その際カバレッジ35%以下を低カバレッジ、70%以上を高カバレッジと見なす)

詳細な書き方に関してはこちらを参照 → 付録C XML 設定ファイル

PHPUnitの実行

$ vendor/bin/phpunit
PHPUnit 6.4.3 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 205 ms, Memory: 4.00MB

OK (1 test, 1 assertion)

Generating code coverage report in HTML format ... done

今までとは違い、Generating code coverage report in HTML format ... done と出力される。
reportディレクトリが出来上がっていると思うので、その中にある index.html をブラウザで開くと以下のようなレポートが閲覧できる。

3.2 Coverallsアカウントを登録しよう

GitHub にログイン

例のごとく GitHubアカウントで認証を行う。こちら → GitHub
Coveralls は Bitbuketにも対応してるみたい。

Coveralls にサインイン

Coveralls に移動し、右上のSIGN INを選択しサインインを完了させる。

GITHUBを選ぶ

リポジトリの登録

無事にサインインが済んだら今度は対象となるリポジトリを登録する。
左のペインからに ADD REPOS をクリックするとリポジトリ一覧が出てくる。

対象リポジトリを選んで、スイッチをONにする。(下記の画像はOFF)

ONするとDETAILボタンが出てくるので移動しておこう。

もう一度おさらいすると以下のような流れになる。

  1. GitHub に Push
  2. TravisCI で PHPUnit 実行
  3. PHPUnit で カバレッジレポートXMLを出力
  4. TravisCI 終了時に Coveralls のAPIに対してレポートXMLを送信

このうち 1 と 2 は既にできているので3から行っていく。

3.3 PHPUnit で カバレッジレポートXMLを出力しよう

COMMIT: 3.3 PHPUnit で カバレッジレポートXMLを出力

phpunit.xml.dist
 phpunit.xml.dist | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 864be6f..bee2939 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -13,6 +13,7 @@
     </filter>

     <logging>
-          <log type="coverage-html" target="./report" lowUpperBound="35" highLowerBound="70"/>
+          <log type="coverage-clover" target="./report/clover.xml"/>
+          <!-- <log type="coverage-html" target="./report" lowUpperBound="35" highLowerBound="70"/> -->
     </logging>
 </phpunit>

ログの出力形式をXMLにして、ついでにもう不要なHTML形式をコメントアウト。
この状態で PHPUnit を実行してみる。

$ vendor/bin/phpunit
PHPUnit 6.4.3 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 131 ms, Memory: 4.00MB

OK (1 test, 1 assertion)

Generating code coverage report in Clover XML format ... done

report/clover.xml が出力されているはず。

3.4 TravisCI 終了時に Coveralls のAPIに対してレポートXMLを送信しよう

COMMIT: 3.4 TravisCI 終了時に Coveralls のAPIに対してレポートXMLを送信

APIにXMLを送信してくれる素晴らしいライブラリが存在するので、これを使う。

composer require --dev php-coveralls/php-coveralls

インストールしたら php-coveralls が読み込む設定ファイルを追加。

.coveralls.yml
coverage_clover: report/clover.xml
json_path: report/coveralls-upload.json

php-coveralls は .coveralls.yml に記載された XMLファイルをパース、JSONを出力してアップロードするという流れでAPIを叩く。それぞれデフォルト設定があるので詳しくはライブラリのREADMEを参照。

最後に TravisCI の設定で php-coveralls を叩く処理を追記する。

.travis.yml
 .travis.yml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.travis.yml b/.travis.yml
index 818e947..cead344 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,3 +6,6 @@ php:
 before_script:
   - curl -s http://getcomposer.org/installer | php
   - php composer.phar install
+
+after_success:
+  - vendor/bin/coveralls -v

この状態でPushし、しばらくすると Coveralls にカバレッジレポートが送信されている!

3.5 GitHubにCoverallsのバッチを貼ろう

COMMIT: 3.5 GitHubにCoverallsのバッチを貼ろう

この段階ではビルドしたブランチしか Coveralls に出てこないので、メインブランチにマージして再度CIを走らせる。
ビルドが完了したら再度 Coveralls に戻り、下記の画像の位置をクリック。
するとご丁寧なことにスニペットが何種類か出てくるので Markdown 形式をバッチに貼ろう。

一通り完成!

あとがき

とにかく敷居を下げることを目的にしたので、慣れてきたころに公式ドキュメントを読んでみてください。
この後この環境でTDDの解説みたいなのも書いてみようかな・・・