概要
ci-phpunit-testで、色々と実装してきたphpunitのテストコードに対して、Coverage Reportを出力していきたいと思います。
phpunit実行時に出ていた出力内容で
以下のようにphpunitを実行すると、Warningが出ておりました。
# 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をインストール
# dnf install php74-php-pecl-xdebug
以下を追記
[xdebug]
zend_extension=xdebug
これでphpunitを実行すると以下のエラーが発生するようになってしまった。
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がどこにいるのか探してみます。
# find / -name "xdebug.so"
/opt/remi/php74/root/usr/lib64/php/modules/xdebug.so
上記フォルダに存在しているようなので、php.iniファイルを以下のように修正します。
[xdebug]
;zend_extension=xdebug
zend_extension="/opt/remi/php74/root/usr/lib64/php/modules/xdebug.so"
再度phpunitを実行するとエラーが解消され、以下のような出力内容に変わりました。
# ../../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のサービスは再起動しておきます。
# systemctl restart php-fpm
上記までの対応でCoverage Reportが無事出力されたようです。
出力先は以下になってました。
/var/www/html/codeigniter3/application/tests/build/coverage
Coverage Reportをブラウザで見れるようにする
出力されたCoverage ReportはHTML形式でも出力されていますので、ブラウザで見れるようにします。
# cd /var/www/html/codeigniter3/public/
# ln -s /var/www/html/codeigniter3/application/tests/build/coverage coverage
シンボリックリンクしか思いつかなかったので、閲覧可能な状態にしてブラウザでアクセス
Dashboardはこんな感じ
これでどの程度テストコードが実装できたのかビジュアル化できました。
カバレッジ100%目指す!なんてことはしませんが、これでテストコードを実装するモチベーションが上がってきたんで、これからちょいちょいテストコード作って、ある程度満足したら続きの機能を作り込んで行こうかなと思います。
後日追記
以下のように--testdox-html
のパラメータを指定することで、テストクラスに定義したfunctionの名前がリスト表示されます。
簡単なテスト仕様書(テストリスト)としては利用できるかなと。
# ../../vendor/bin/phpunit --testdox --testdox-html /var/www/html/codeigniter3/public/testdox/index.html