正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

カバレッジの可視化

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

artifacts:reports:coverage_reportキーワードを使用して、MR差分に1行ごとのカバレッジアノテーションを表示します。

このキーワードは、差分アノテーションのみを表示します。カバレッジの割合をMRウィジェットに表示したり、カバレッジ履歴グラフにデータを入力したりすることはありません。カバレッジの割合を表示するには、coverageキーワードを個別に設定します。

パイプラインが完了すると、GitLabはバックグラウンドでレポートを処理し、MR差分の行にアノテーションを付けます:

  • 緑: 行はテストによってカバーされています。
  • 赤: 行はテストによってカバーされていません。
  • オレンジ (Coberturaのみ): 行は読み込まれますが、実行されません。

アノテーションは、MR差分で変更されたファイルにのみ表示されます。MRで変更されていないファイルには、レポートにカバレッジデータが含まれていても、アノテーションは付けられません。

カバレッジの可視化を設定する

カバレッジの可視化を設定するには、artifacts:reports:coverage_reportをジョブに追加します:

test:
  script:
    - run tests with coverage
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura  # or jacoco
        path: coverage/coverage.xml

言語固有の例については、以下を参照してください:

複数のレポートを収集するには、アーティファクトパスでワイルドカードを使用します。GitLabは結果を1つのレポートにマージします。

子パイプラインからのカバレッジレポートは、MR差分のアノテーションに表示されます。

制限

制限
Cobertura XMLファイルの最大サイズ10 MiB
Cobertura XMLファイル内の最大<source>ノード数100

Coberturaレポートが100個を超える<source>ノードの場合、差分表示でアノテーションが欠落したり、一致しなかったりする可能性があります。大規模なプロジェクトの場合は、レポートをより小さなファイルに分割します。詳細については、イシュー328772を参照してください。

可視化はパイプラインが完了した後にのみ表示されます。パイプラインにブロックする手動ジョブがある場合、そのジョブが実行されるまで可視化は利用できません。

ジョブ詳細ページからカバレッジレポートをダウンロードするには、それをアーティファクトpathsreportsの両方に追加します:

artifacts:
  paths:
    - coverage/cobertura-coverage.xml
  reports:
    coverage_report:
      coverage_format: cobertura
      path: coverage/cobertura-coverage.xml

パスの解決

カバレッジレポートは相対ファイルパスを使用します。GitLabは、MRで変更されたファイルと照合することにより、これらを絶対リポジトリパスに解決します。

JaCoCoの場合、マッチングプロセスは次のとおりです:

  1. 同じパイプライン参照のすべてのMRを見つけます。
  2. 変更されたすべてのファイルについて、絶対パスを収集します。
  3. レポート内の各相対パスについて、最初の一致する絶対パスを使用します。

Coberturaの場合、GitLabは<sources>要素も使用してパスを再構築します:

  1. <source>エントリからパスセグメントを抽出します。
  2. 各セグメントを、各<class>要素のfilename属性と結合します。
  3. 候補パスがリポジトリに存在するかどうかを確認します。
  4. 最初の一致を絶対パスとして使用します。

この自動修正は、<source>パスが<CI_BUILDS_DIR>/<PROJECT_FULL_PATH>/...の形式に従っている場合にのみ機能します。

パスの解決例

C#プロジェクトで、フルパスがtest-org/test-cs-projectで、プロジェクトルートに対するこれらのファイル:

Auth/User.cs
Lib/Utils/User.cs

Cobertura XML内のこれらのsources:

<sources>
  <source>/builds/test-org/test-cs-project/Auth</source>
  <source>/builds/test-org/test-cs-project/Lib/Utils</source>
</sources>

パーサーはsourcesからAuthLib/Utilsを抽出し、それぞれを各<class>要素のfilename属性と結合します。filename="User.cs"を持つクラスの場合、リポジトリ内のファイルと一致する最初の候補はAuth/User.csです。

<class>要素に対して、パーサーは最大100回のイテレーションを試行します。一致が見つからない場合、そのクラスは最終的なカバレッジレポートに含まれません。

トラブルシューティング

カバレッジ可視化を使用する際、以下のイシューに遭遇する可能性があります。

差分アノテーションが表示されない

アノテーションは、以下の理由で表示されない場合があります:

  • パイプラインが完了していません。アノテーションは、パイプラインが完了した後に生成されます。パイプラインが完了するまで待ってから、MR差分をリロードしてください。

  • ファイルがMR差分にありません。アノテーションは、MRで変更されたファイルにのみ表示されます。レポートに他のファイルのカバレッジデータが含まれていても同様です。

  • レポート内のファイルパスがリポジトリパスと一致しません。パスの解決が失敗すると、アノテーションはサイレントにスキップされます。診断するには、カバレッジXMLアーティファクトをダウンロードし、<class>要素のfilename属性を、プロジェクトルートからのリポジトリ内のファイルのパスと比較します。

  • プロジェクトには、重複する相対パスを持つ複数のモジュールがあります。パスがモジュール全体で一意でない場合、GitLabはアノテーションがどのファイルに属するかを解決することができません。相対パスがモジュール全体で一意であることを確認してください:

        src/main/java/org/acme/DemoExample.java
      - src/main/other-module/org/acme/DemoExample.java
      + src/main/other-module/org/acme/OtherDemoExample.java
    
  • coverageキーワードが設定されていません。artifacts:reports:coverage_reportはMRウィジェットに割合を表示しません。カバレッジの割合を表示するには、coverageキーワードを個別に設定します。

変更されたすべてのファイルにメトリクスが表示されない

このイシューは、同じソースブランチから新しいMRを作成し、ターゲットブランチが異なる場合に発生します。パイプラインは、以前のMRからの差分を使用し、その差分にないファイルのアノテーションは表示しません。

このイシューを修正するには、新しいMRが作成されるまで待ってから、パイプラインを再実行します。