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

# 目次

1. [PHPUnit を導入しよう](https://qiita.com/PruneMazui/items/f70e49963ef40cf0dadd)
2. [CI環境を導入しよう](https://qiita.com/PruneMazui/items/640ca7b7f9a88fd1793c)
3. コードカバレッジを計測しよう（本記事）

# はじめに

この記事の目的や環境情報は[最初の記事](https://qiita.com/PruneMazui/items/f70e49963ef40cf0dadd)を参照。

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

[コード網羅率 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E7%B6%B2%E7%BE%85%E7%8E%87)

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

今回は [Coveralls](https://coveralls.io/) というサービスを利用して、カバレッジレポートを表示。
最終的に以下のような流れになる。

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


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

**[COMMIT: 3.1 ローカルにレポートを出力しよう](https://github.com/PruneMazui/phpunit-training/commit/2f4b66a53c3a456577d1cdd3a45a98bb6f195ccf)**

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

**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。

**設定ファイルに追記**

```diff: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 設定ファイル](https://phpunit.de/manual/current/ja/appendixes.configuration.html)

**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 をブラウザで開くと以下のようなレポートが閲覧できる。

![2017-11-07_18h27_00.png](https://qiita-image-store.s3.amazonaws.com/0/31393/ae1c4b91-c786-563a-ed08-920f4c78c901.png)


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

**GitHub にログイン**

例のごとく GitHubアカウントで認証を行う。こちら → [GitHub](https://github.com/)
Coveralls は Bitbuketにも対応してるみたい。

**Coveralls にサインイン**

[Coveralls](https://coveralls.io/) に移動し、右上のSIGN INを選択しサインインを完了させる。

![2017-11-08_10h40_01.png](https://qiita-image-store.s3.amazonaws.com/0/31393/ca0ebfd3-b3dd-b99c-bbee-5f31459d2080.png)

GITHUBを選ぶ

![2017-11-08_10h41_40.png](https://qiita-image-store.s3.amazonaws.com/0/31393/82ffa168-b73a-5536-1dd5-8b024db1a2c3.png)

**リポジトリの登録**

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

![2017-11-08_10h44_01.png](https://qiita-image-store.s3.amazonaws.com/0/31393/90f96f89-dc41-ec54-4c8f-10cd7ef34afe.png)

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

![2017-11-08_10h47_20.png](https://qiita-image-store.s3.amazonaws.com/0/31393/d7151a7e-6d57-1777-0cd8-5d63ac5cfbd7.png)

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を出力](https://github.com/PruneMazui/phpunit-training/commit/f99e1b68ae365748011673ba0ad53d9c9cf98744)**

```diff: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を送信 ](https://github.com/PruneMazui/phpunit-training/commit/aeb94c74ed669d5a56ff5a4a19f80e6d62259b85)**


APIにXMLを送信してくれる[素晴らしいライブラリ](https://github.com/php-coveralls/php-coveralls)が存在するので、これを使う。

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

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

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

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

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

```diff:.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 にカバレッジレポートが送信されている！

![2017-11-08_11h58_54.png](https://qiita-image-store.s3.amazonaws.com/0/31393/156ce5bb-0709-39e6-5151-cac99d2498da.png)


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

**[COMMIT: 3.5 GitHubにCoverallsのバッチを貼ろう](https://github.com/PruneMazui/phpunit-training/commit/a7ff60b7fec042af8910c643402e2efd10b78d38)**


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

![2017-11-08_12h08_48.png](https://qiita-image-store.s3.amazonaws.com/0/31393/9e9ba24c-e8de-43a5-c2f9-a38fe351640a.png)

一通り完成！

![2017-11-08_12h23_37.png](https://qiita-image-store.s3.amazonaws.com/0/31393/85f2a666-e936-94ac-9779-6d2b78b8db5c.png)


# あとがき

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