ユニットテストレポート

  • GitLab 11.2で導入されました。GitLab Runner 11.2以降が必要です。
  • GitLab 13.4でJUnitテストレポーターからUnitテストレポーターに改名

CI/CD パイプラインにコードを検証するテストジョブが含まれていることはよくあります。テストが失敗すると、パイプラインは失敗し、ユーザーに通知されます。マージリクエストを担当する人は、ジョブのログをチェックしてテストが失敗した箇所を確認し、修正できるようにしなければなりません。

ジョブをユニットテストレポートを使うように設定すると、GitLab はマージリクエストにレポートを表示します。ユニットテストレポートは現在、JUnit レポート形式のテストレポートのみをサポートしています。

マージリクエストを使用しない場合でも、ジョブログを検索せずにユニットテストレポートの出力を見たい場合は、パイプラインの詳細ビューで完全なユニットテストレポートを利用できます。

次のようなワークフローを考えてみましょう。

  1. デフォルトブランチは強固で、プロジェクトは GitLab CI/CD を使っていて、パイプラインは何も壊れていないことを示しています。
  2. チームの誰かがマージリクエストを作成して、そのテストが失敗すると、パイプラインには赤いアイコンが表示されます。詳細を調べるには、ジョブのログを調べてテストが失敗した原因を突き止める必要があります。しかし、ログは何千行にもなる場合があります。
  3. ユニットテストレポートを設定すると、すぐにGitLabはそれらをマージリクエストに集めて公開します。もうジョブログを探す必要はありません。
  4. 開発とデバッグのワークフローがより簡単に、より速く、より効率的になります。

どのように動作するか

まず、GitLab RunnerはすべてのJUnitレポートフォーマットXMLファイルを アーティファクトとしてGitLabにアップロードします。そして、マージリクエストにアクセスすると、GitLab はヘッドブランチとベースブランチの JUnit レポートフォーマット XML ファイルの比較を開始します:

  • ベースブランチはターゲットブランチ(通常はデフォルトブランチ)。
  • headブランチとは、マージリクエストのソースブランチのことです。

テストサマリパネルには、どれだけのテストが失敗し、どれだけのエラーが発生し、どれだけのテストが修正されたかが表示されます。ベースブランチのデータがないために比較できない場合は、ソースブランチの失敗したテストのリストのみが表示されます。

結果の種類は次のとおりです:

  • 新たに失敗したテスト:ベースブランチで合格し、ヘッドブランチで失敗したテストケース。
  • 新たに発生したエラー:ベースブランチでは合格し、ヘッドブランチではテストエラーのために失敗したテストケース。
  • 既存の失敗:ベースブランチで失敗し、ヘッドブランチでも失敗したテストケース。
  • 解決済みの失敗:ベースブランチで失敗し、ヘッドブランチで合格したテストケース。

失敗したテストを見る

Test summary(テスト サマリー)パネルの各エントリには、テスト名と結果タイプが表示されます。テスト名を選択すると、実行時間とエラー出力の詳細が表示されたモーダルウィンドウが開きます。

Test Reports Widget

失敗したテスト名のコピー

GitLab 15.2 で導入されました

テストサマリーパネルに失敗したテストが表示されている場合、失敗したテストの名前とパスをコピーすることができます。名前とパスを使用して、検証のためにローカルでテストを検索し、再実行します。

すべての失敗したテストの名前をコピーするには、テスト サマリーパネルの上部で、失敗したテストのコピー を選択します。失敗したテストは、スペースで区切られた文字列として一覧表示されます。

単一の失敗したテストの名前をコピーするには、以下の手順に従います:

  1. テスト サマリーの詳細を表示({chevron-lg-down})を選択して、テスト サマリーパネルを展開します。
  2. レビューするテストを選択します。
  3. テスト名をコピーしてローカルで再実行する({copy-to-clipboard})を選択します。

最近の失敗回数

プロジェクトのデフォルトブランチで過去14日間にテストが失敗した場合、そのテストに対してFailed {n} time(s) in {default_branch} in the last 14 days のようなメッセージが表示されます。

設定方法

マージリクエストでユニットテストレポートを有効にするには、.gitlab-ci.ymlartifacts:reports:junit を追加し、生成されるテストレポートのパスを指定する必要があります。レポートは.xml ファイルでなければなりません。そうでない場合、GitLab はエラー 500 を返します

以下のRubyの例では、test ステージのジョブが実行され、GitLabはジョブからユニットテストレポートを収集します。ジョブが実行されると、XML レポートがアーティファクトとして GitLab に保存され、マージリクエストウィジェットに結果が表示されます。

## Use https://github.com/sj26/rspec_junit_formatter to generate a JUnit report format XML file with rspec
ruby:
  stage: test
  script:
    - bundle install
    - bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml
  artifacts:
    when: always
    paths:
      - rspec.xml
    reports:
      junit: rspec.xml

ユニットテストレポートの出力ファイルを閲覧できるようにするには、例のようにartifacts:paths キーワードも含めます。ジョブが失敗した場合 (たとえばテストがパスしなかった場合) でもレポートをアップロードするには、artifacts:when:always キーワードを使用します。

JUnit レポート形式 XML ファイルに、同じ名前とクラスを持つ複数のテストを含めることはできません。

GitLab 15.0 以前では、parallel:matrixジョブのテストレポートが一緒に集約されるため、一部のレポート情報が表示されないことがありました。GitLab 15.1 以降ではこのバグが修正され、すべてのレポート情報が表示されるようになりました。

GitLab でユニットテストレポートを見る

JUnit レポート形式の XML ファイルがパイプラインの一部として生成されアップロードされた場合、これらのレポートはパイプラインの詳細ページで見ることができます。このページのTestsタブには、XML ファイルからレポートされたテストスイートとケースのリストが表示されます。

Test Reports Widget

すべての既知のテスト スイートを表示し、それぞれを選択して、スイートを構成するケースなどの詳細 を表示できます。

また、GitLab API経由でレポートを取得できます。

ユニットテストのレポート解析エラー

GitLab 13.10で導入されました

JUnit レポート XML の解析でエラーが発生した場合、ジョブ名の横にインジケータが表示されます。アイコンにカーソルを合わせると、ツールチップにパーサーエラーが表示されます。グループ化されたジョブから複数の解析エラーが発生した場合、GitLabはそのグループから最初のエラーだけを表示します。

Test Reports With Errors

テストケースの解析限界については、ユニットテストレポートあたりの最大テストケースを参照してください。

GitLabはJUnitレポートの非常に大きなノードを解析しません。これをオプションにするイシューがオープンされています。

GitLabでJUnitのスクリーンショットを見る

スクリーンショットをアーティファクトとしてGitLabにアップロードすることができます。JUnitレポートフォーマットのXMLファイルにattachment タグが含まれている場合、GitLabは添付ファイルを解析します。スクリーンショットのアーティファクトをアップロードする場合:

  • attachment タグには、アップロードしたスクリーンショットの$CI_PROJECT_DIR への相対パスを含める必要があります。例えば

     <testcase time="1.00" name="Test">
       <system-out>[[ATTACHMENT|/path/to/some/file]]</system-out>
     </testcase>
    
  • テストが失敗した場合でもスクリーンショットをアップロードするように、スクリーンショットをアップロードするジョブをartifacts:when: always に設定する必要があります。

添付ファイルがアップロードされると、パイプライン・テスト・レポートにはスクリーンショットへのリンクが含まれます:

Unit test report screenshot example

トラブルシューティング

テストレポートに何も表示されない

レポートを含むアーティファクトの有効期限が切れると、ユニット テスト レポートがマージ リクエストで表示されたときに空に見えることがあります。アーティファクトの有効期限が早すぎる場合は、レポート アーティファクトにexpire_in より長い値を設定してください。

また、新しいパイプラインを実行して新しいレポートを生成することもできます。