CodeIgniter3でci-phpunit-test 2.xを利用したUnitTestいろいろ④（Coverage Reportを出力する）

# 概要

ci-phpunit-testで、色々と実装してきたphpunitのテストコードに対して、Coverage Reportを出力していきたいと思います。

# phpunit実行時に出ていた出力内容で

以下のようにphpunitを実行すると、Warningが出ておりました。

```shell-session
# cd /var/www/html/codeigniter3/application/tests
# ../../vendor/bin/phpunit --testdox

PHPUnit 9.4.0 by Sebastian Bergmann and contributors.

Warning:       No code coverage driver available
Warning:       Your XML configuration validates against a deprecated schema.
Suggestion:    Migrate your XML configuration using "--migrate-configuration"!

Gmo_api_model_test
 ✔ G m o決済リンク urlが正常に取得できること
 ✔ G m o決済リンク url取得失敗の詳細が exceptionで伝播されること
 ✔ G m oカード会員編集 urlが正常に取得できること

Gmo_result_notification_logs_model_test
 ✔ ログの登録が正常に完了すること
 ✔ 登録済みのログが削除できること
 ✔ 登録した順序の降順で取得できること

Time: 00:00.047, Memory: 8.00 MB

OK (6 tests, 29 assertions)
```

`No code coverage driver available`は、xdebugが使えるようになっていないことを表しているようです。

# xdebugをインストール

```shell-session
# dnf install php74-php-pecl-xdebug
```

以下を追記

```ini:/etc/php.ini
[xdebug]
zend_extension=xdebug
```

これでphpunitを実行すると以下のエラーが発生するようになってしまった。

```shell-session
A PHP Error was encountered

Severity:    Core Warning
Message:     Failed loading Zend extension 'xdebug' (tried: /usr/lib64/php/modules/xdebug (/usr/lib64/php/modules/xdebug: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/xdebug.so (/usr/lib64/php/modules/xdebug.so: cannot open shared object file: No such file or directory))
Filename:    Unknown
Line Number: 0

Backtrace:
```

どうやら、先ほどphp.iniに追記した`zend_extension=xdebug`という設定が、xdebug.soを参照する設定のようで、そのxdebug.soファイルが見つからなくてエラーになっているようです。
私の環境は`php:remi-7.4`を利用しているため、標準リポジトリからセットアップされるphpのモジュールとはディレクトリ構成が違うようです。

xdebug.soがどこにいるのか探してみます。

```shell-session
# find / -name "xdebug.so"
/opt/remi/php74/root/usr/lib64/php/modules/xdebug.so
```

上記フォルダに存在しているようなので、php.iniファイルを以下のように修正します。

```ini:/etc/php.ini
[xdebug]
;zend_extension=xdebug
zend_extension="/opt/remi/php74/root/usr/lib64/php/modules/xdebug.so"
```

再度phpunitを実行するとエラーが解消され、以下のような出力内容に変わりました。

```shell-session
# ../../vendor/bin/phpunit --testdox
PHPUnit 9.4.0 by Sebastian Bergmann and contributors.

Warning:       Your XML configuration validates against a deprecated schema.
Suggestion:    Migrate your XML configuration using "--migrate-configuration"!

Gmo_api_model_test
 ✔ G m o決済リンク urlが正常に取得できること
 ✔ G m o決済リンク url取得失敗の詳細が exceptionで伝播されること
 ✔ G m oカード会員編集 urlが正常に取得できること

Gmo_result_notification_logs_model_test
 ✔ ログの登録が正常に完了すること
 ✔ 登録済みのログが削除できること
 ✔ 登録した順序の降順で取得できること

Time: 00:00.294, Memory: 16.00 MB

OK (6 tests, 29 assertions)

Generating code coverage report in Clover XML format ... done [00:00.297]

Generating code coverage report in HTML format ... done [00:00.110]
```

この状態でWebアプリにアクセスすると、設定した内容が反映されないみたいなので、php-fpmのサービスは再起動しておきます。

```shell-session
# systemctl restart php-fpm
```

上記までの対応でCoverage Reportが無事出力されたようです。
出力先は以下になってました。

`/var/www/html/codeigniter3/application/tests/build/coverage`

# Coverage Reportをブラウザで見れるようにする

出力されたCoverage ReportはHTML形式でも出力されていますので、ブラウザで見れるようにします。

```shell-session
# cd /var/www/html/codeigniter3/public/
# ln -s /var/www/html/codeigniter3/application/tests/build/coverage coverage
```

シンボリックリンクしか思いつかなかったので、閲覧可能な状態にしてブラウザでアクセス

https://tk2-999-99999.vs.sakura.ne.jp/coverage/

![スクリーンショット 2020-10-11 18.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/597fd295-e5ea-8b2d-be7c-12772fc857da.png)

Dashboardはこんな感じ

![screencapture-tk2-253-36402-vs-sakura-ne-jp-coverage-dashboard-html-2020-10-11-18_15_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8d9621a7-e577-d26f-007b-b9b0d4c9e828.png)

これでどの程度テストコードが実装できたのかビジュアル化できました。
カバレッジ１００％目指す！なんてことはしませんが、これでテストコードを実装するモチベーションが上がってきたんで、これからちょいちょいテストコード作って、ある程度満足したら続きの機能を作り込んで行こうかなと思います。

# 後日追記

以下のように`--testdox-html`のパラメータを指定することで、テストクラスに定義したfunctionの名前がリスト表示されます。
簡単なテスト仕様書（テストリスト）としては利用できるかなと。

```shell-session
# ../../vendor/bin/phpunit --testdox --testdox-html /var/www/html/codeigniter3/public/testdox/index.html
```