Laravelのテスト(PHPUnit)で出したカバレッジをCodeBuildで表示する(Clover/Cobertura)

スポンサーリンク

Laravelのテスト(PHPUnit)で出したカバレッジをCodeBuildのレポート機能で出そうとしたところ、一部詰まるところがあったのでメモです。

(php:alpineコンテナでカバレッジ出すまでの設定については以下で解説しています。)
PHP AlpineコンテナにXdebugをインストールしLaravelのカバレッジ表示を有効化する

TL;DR

--coverage-clover は読み込めない。
--coverage-cobertura を使う。

経緯

Laravelの php artisan test--coverage-clover オプションでClover形式のカバレッジレポートを出力できます。
CodeBuildも file-format: CLOVERXML に対応しているのでこれで問題なくカバレッジレポートを使用できるように見えます。

Dockerfile

FROM php:8.2-fpm-alpine
# Composerインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Xdebugをインストールした後、依存パッケージを削除
RUN apk add --no-cache --virtual .xdebug-deps $PHPIZE_DEPS linux-headers \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && apk del -f .xdebug-deps
# Xdebugの設定
RUN echo 'xdebug.mode=develop,debug,coverage' >> /usr/local/etc/php/conf.d/99-xdebug.ini

COPY . /var/www/html
RUN composer install
RUN cp .env.example .env

buildspec.xml

version: 0.2

phases:
  build:
    on-failure: ABORT
    commands:
      - docker build -t laravel-coverage .
  post_build:
    on-failure: ABORT
    commands:
      - docker run --rm --volume $PWD/coverage:/var/www/html/coverage
        laravel-coverage ash -c "php artisan key:generate && php artisan test --coverage-cobertura coverage/coverage.xml"
reports:
  laravel-coverage:
    files:
      - coverage/coverage.xml
    file-format: COBERTURAXML

artisan testのヘルプには --coverage-clover オプションは書かれていませんが実際にはPHPUnitのオプションが通ります。

しかしこれでClover形式のXMLが出力されたにも関わらず、CodeBuildのログは以下のようなエラーが出ており、ビルド失敗となりレポートも表示できません。

[Container] 2023/02/12 06:55:31 Phase complete: UPLOAD_ARTIFACTS State: SUCCEEDED
[Container] 2023/02/12 06:55:31 Phase context status code:  Message: 

Error in UPLOAD_ARTIFACTS phase: [laravel-coverage: [error processing report: [InvalidParameter: 19 validation error(s) found.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[0].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[1].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[2].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[3].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[4].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[5].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[6].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[7].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[8].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[9].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[10].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[11].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[12].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[13].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[14].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[15].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[16].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[17].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[18].FilePath.
 InvalidInputException: Report status is invalid]]]

エラーで検索したところ、GitHubにIssueがありました。

AWS CodeBuild not recognize Clover XML format report #828
上記でDuplicateとしてリンクされているIssueを見ると
Generated Clover XML logfiles do not validate against clover.xsd #578

vnrmc commented on Mar 25, 2021
@jimdelois use cobertura as small workaround (–coverage-cobertura, available since phpunit 9.4) and modify your buildpec:
… reports: codecoverage: … file-format: ‘COBERTURAXML’

直ってはいないようですがPHPUnitは9.4からCobertura形式もサポートしているのでそっちを使うといいよと書いてありました。
なのでCoberturaを使ってみます。

解決

buildspec.yml

version: 0.2

phases:
  build:
    on-failure: ABORT
    commands:
      - docker build -t laravel-coverage .
  post_build:
    on-failure: ABORT
    commands:
      # --coverage-coberturaに変更
      - docker run --rm --volume $PWD/coverage:/var/www/html/coverage
        laravel-coverage ash -c "php artisan key:generate && php artisan test --coverage-cobertura coverage/coverage.xml"
reports:
  laravel-coverage:
    files:
      - coverage/coverage.xml
    # ここのフォーマット指定も変更
    file-format: COBERTURAXML

これでCobertura形式のXMLを出力し、無事CodeBuildでレポートを確認することができました。
(やたら長い名前なのはCDKで作ったからです。)

CodeBuildカバレッジレポート

コメント