Coverageの計測をxdebugからpcovに変えたら、CIの実行時間が5分の1になった
PCOVなるものを使うと、CIがめっちゃ早くなるという情報を得て、早速CIに導入してみました
pcovとは
超高速にCoverageの計測が出来るドライバーです。
こちら を確認してみると2019/1/16に初めてリリースされた、かなり新しめのプロジェクトのようですね
動作要件はPHP7.1以上です
インストールはpeclもしくはソースからビルド出来ます。僕はpeclでインストールしました。
詳しくはこちら
CI用Dockerコンテナの作り直し
今まではxdebugで計測していたので、その部分をpcovに変更します。
(CircleCIのconfig.ymlで直接xdebugのインストールしている人は適宜読み替えてください)
FROM php:7.3 # 中略 - RUN pecl install xdebug \ - && docker-php-ext-enable xdebug + RUN pecl install pcov \ + && docker-php-ext-enable pcov
そして、書き直したDockerfileをビルドし直して、DockerHubにあげておきます。
cd /path/to/docker docker build -t {DockerHubのアカウント名}/php_for_circleci . docker push {DockerHubのアカウント名}/php_for_circleci:latest
CircleCIのconfigを修正
イメージに先ほどのコンテナを指定しておき、テストの実行方法を指定します。
version: 2 jobs: test: docker: - image: {DockerHubのアカウント名}/php_for_circleci:latest # 中略 + - run: + name: test + command: php -d pcov.directory=./ -d pcov.exclude=./tests vendor/bin/codecept run --coverage-xml
ポイントは、 php -d pcov.directory=./ -d pcov.exclude=./tests
の部分で、 -d
オプションでiniの設定をオーバーライドしてます。
pcov.directory
は、カバレッジ計測対象のディレクトリを指定します。
ここが指定されていない場合は、カレントディレクトリからsrc、lib、appの順にディレクトリを探し、そのディレクトリ内のカバレッジを計測するようです。*1
つまりデフォルトの状態では、計測対象のディレクトリがsrcでもlibでもappでもない場合はカバレッジの計測をしてくれないことになります。
pcov.exclude
はカバレッジ計測から除外するディレクトリを指定します。
pcov.directory
にテストコードのディレクトリが含まれている場合は、そのディレクトリのカバレッジを計測してもマシンリソースの無駄なので除外します。
複数ディレクトリを除外したい場合は -d pcov.exclude="~(foo|bar)~"
のような書き方をします。
僕は実行時のオプションでディレクトリの指定をしていますが、php.iniに設定を書き込んでも問題ないと思います
おわり
なんとこれだけのステップで導入出来ます。
実質pcovをインストールするだけですね
僕の場合は、ユニットテストが5.5minほど掛かっていたのですが、1minまで短縮されました。
よかったですね。