次の方法で共有


Azure Pipelines でコード カバレッジの結果を確認して構成する

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

コード カバレッジは、単体テストなど、実際にテストされているプロジェクトのコードの割合を判断するのに役立ちます。 コードの変更に対する信頼度を高め、バグから効果的に保護するには、テストでコードの大部分を実行またはカバーする必要があります。

コード カバレッジの結果を確認すると、テストでカバーされないコード パスを特定できます。 この情報は、テスト負債を減らすことで、時間の経過に伴うテスト カバレッジの向上に役立ちます。

この記事では、Azure Pipelines でコード カバレッジを表示、構成、トラブルシューティングする方法について説明します。 プル要求の差分カバレッジを設定し、カバレッジ ポリシーを構成し、一般的な問題を解決する方法について説明します。

Azure Pipelines でサポートされているさまざまなバージョン管理システムからコードをビルドできますが、この記事で説明する pull requests 機能のコード カバレッジは現在、Azure Repos でのみ使用できます。

サポートされている形式、タスク、成果物

サポートされるフォーマット

Azure Pipelines では、「Publish Code Coverage Results v2」タスクを使用して、コード カバレッジの結果を発行できます。 タスクは、2 つの異なるビューで結果を表示できます。

  • cobertura、jacoco、clover、gcov、pcov、およびその他の xml 形式の場合、HTML ビューが生成され、コード カバレッジ レポートの詳細が含まれており、ほとんどのお客様が優先します。
  • .coverage / .cjson / .covxの場合、 表形式のビューが生成され、HTML ビューよりも詳細が少なくなります。

成果物と結果

ビルド中に発行されたコード カバレッジ成果物は、パイプライン実行の概要の [ 概要 ] タブで表示できます。

スクリーンショットは、手動実行と 2 つの発行済みアイテムを含む [概要] タブを示しています。

さらに、[コード カバレッジ] タブ のコード カバレッジ レポートから結果を確認できます。

スクリーンショットは、概要、メトリック、カバレッジを含む [コード カバレッジ] タブの内容を示しています。

  • Cobertura または JaCoCo カバレッジ形式を使用してコード カバレッジを発行する場合、コード カバレッジ成果物には、さらに分析するためにオフラインで表示できる .html ファイルが含まれます。 HTML レポートの概要を示すスクリーンショット。
  • .NET と .NET Core の場合は、ビルドの概要でコード カバレッジ マイルストーンを選択することで、成果物をダウンロードするためのリンクにアクセスできます。
  • Visual Studio Test ツール では、.NET アプリと .NET Core アプリのカバレッジを収集することができます。 Visual Studio でさらに分析するためにダウンロードして使用できる .coverage ファイルが生成されます。 コードカバレッジ結果を表示したスクリーンショット。

タスク

コード カバレッジの結果を発行 すると、コード カバレッジの結果が、 Cobertura または JaCoCo 形式のビルドによって生成された Azure Pipelines に発行されます。

Visual Studio Test.NET CoreAntMavenGulpGruntGradle などの組み込みタスクには、コード カバレッジ データをパイプラインに発行するオプションが用意されています。

Docker に関する考慮事項

Docker を使用するアプリの場合は、コンテナー内でビルドとテストを実行し、コンテナー内でコード カバレッジの結果を生成できます。 結果をパイプラインに発行するには、結果の成果物を [コード カバレッジの結果の発行 ] タスクで使用できるようにします。 参照については、「Docker 用 Docker ファイルを使用して結果を ビルド、テスト、発行する」セクションでテスト結果を発行 する場合の同様の例を参照してください。

重要な考慮事項

  • マルチステージ YAML パイプラインでは、コード カバレッジの結果はパイプライン全体が完了した後にのみ使用できます。 運用環境にデプロイする前にコード カバレッジの結果を確認する場合は、ビルド ステージを独自のパイプラインに分割することが必要になる場合があります。
  • 現在、複数のテスト実行からコード カバレッジの結果をマージすることは、.NET と .NET Core でのみ機能します。 他の形式をサポートする予定はありません。

完全カバレッジと差分カバレッジ

完全カバレッジ は、プロジェクトのコードベース全体のカバレッジを測定します。 プル要求のコンテキストでは、開発者は自分が行っている変更に重点を置き、追加または変更した特定のコード行がカバーされているかどうかを知りたいと考えています。 この種類のカバレッジは差分カバレッジです。

カバレッジ設定 YAML は YAML パイプラインとは異なります。カバレッジ設定はリポジトリに適用され、コードをビルドするパイプラインに関係なく使用されるためです。 この分離は、従来のデザイナー ベースのビルド パイプラインを使用する場合、プル要求のコード カバレッジ状態チェックを受け取ることを意味します。

カバレッジ インジケーターは、pull request コメントの詳細がオンになっているかどうかに関係なく、変更されたファイル ビューに表示されます。

差分カバレッジを設定する

プル要求のコード カバレッジ エクスペリエンスの既定の設定を変更するには、リポジトリのルートに azurepipelines-coverage.yml という名前の構成 YAML ファイルを含めます。 このファイルに必要な値を設定すると、Azure DevOps は次回パイプラインを実行する際に自動的に使用します。

次の設定を行うこともできます:

構成できる設定を示すスクリーンショット。

構成例

coverage:  
  status:                    # Code coverage status will be posted to pull requests based on targets defined below. 
    comments: on             # Off by default. When on, details about coverage for each file changed will be posted as a pull request comment.  
    diff:                    # Diff coverage is code coverage only for the lines changed in a pull request. 
      target: 60%            # Set this to a desired percentage. Default is 70 percent 

詳細については、 コード カバレッジの YAML サンプル リポジトリを参照してください。

カバレッジのステータス、詳細、およびインジケーター

コード カバレッジを収集して発行するようにパイプラインを設定すると、プル要求の作成時にコード カバレッジの状態がポストされます。 既定では、サーバーは、変更された行の少なくとも 70% をテストでカバーしていることを確認します。 以前に言及したターゲットパラメーターを変更することで、差分カバレッジのしきい値を選択した値に設定できます。

カバレッジの状態チェックが失敗しましたことを示すスクリーンショット。

状態チェックでは、プル要求内のすべてのファイルの差分カバレッジが計算されます。 各ファイルの割合を表示するには、前のセクションで説明したように [詳細] を有効にします。 有効にすると、プル要求に詳細がコメントとして投稿されます。

スクリーンショットは、差分カバレッジチェックの失敗結果を示している。

プル要求の変更されたファイル ビューでは、変更された行にもカバレッジ インジケーターが付き、それらの行がカバーされているかどうかを示す注釈が付けられます。

スクリーンショットは、プルリクエストの行変更カバレッジを示すインジケーターです。

コード カバレッジ ポリシーを使用してブランチ保護を適用する

既定では、プル要求のコード カバレッジ状態チェックはアドバイザリであり、カバレッジが低いマージはブロックされません。 マージ前に変更がカバレッジの最小しきい値を満たしていることを確認するには、カバレッジステータスチェックを使用するブランチ ポリシーを構成します。

パイプラインからポストされるコード カバレッジの状態は、名前付け規則 {name-of-your-pipeline/codecoverage} に従います。

  • Azure Repos のブランチ ポリシー (省略可能なポリシーも含む) では、pull request が失敗した場合の自動的な完了を防止しています。 この動作は、コード カバレッジ ポリシーに固有ではありません。
  • ビルドが失敗した場合、コード カバレッジ ポリシーは Failed にオーバーライドされません。

トラブルシューティング ガイド

[コード カバレッジ] タブのカバレッジ ビューに重複する DLL が表示されるのはなぜですか?

パイプラインで .NET Core と .NET Framework の両方が使用されている場合は、重複する DLL が表示されることがあります。 両方を使用する場合は、DLL が重複することが想定されます。これは、同じモジュールが異なるパスから取得されるため、仕様上です。

[コード カバレッジ] タブにカバレッジ データがないのはなぜですか?

この問題は、いくつかの理由で発生する可能性があります。

  • テストまたは DLL が存在しない: ファイルにテストまたは DLL が含まれていない場合、カバレッジ値は 0 です。 カバレッジ値が 0 の場合、Azure DevOps では、タブにコード カバレッジ データは表示されません。 代わりに、[コード カバレッジ] タブの下に、カバレッジ データがない理由を説明するメッセージが表示されます。

  • 空のカバレッジ XML: コード カバレッジの発行タスクを使用する場合、入力として提供 .xml カバレッジに情報が含まれていないか、0 行が含まれている場合、タブの下にカバレッジ データが表示されません。カバレッジ .xml ファイル (入力ファイル) が空であるか、情報がない理由を確認します。

  • ビルドエラー: ビルドが失敗した場合、コード カバレッジ タブに適切なメッセージが表示されます。

  • VSTest タスクの構成: VSTest タスクを使用する場合、コード カバレッジ チェックを有効にしない場合、またはテスト フィルター フィールドでファイルをテストするための不適切な DLL または不適切なパスに言及した場合、カバレッジ データは表示されません。

  • ビルド構成の問題: 複数のビルド構成値が存在し、BuildFlavour や BuildPlatform などのすべての値を設定しない場合があります。 UI には特定のビルド構成の値のみが表示されるため、他のモジュールが不足しています。

  • 大きな HTML ファイル: .html ファイルが 7 MB を超える場合、レポートは [コード カバレッジ] タブでは使用できません。回避策として、概要で公開された成果物から "Code Coverage Report_*" 成果物をダウンロードします。

  • エラー メッセージ: [コード カバレッジ] タブにユーザー固有のエラーに関連するエラー メッセージが含まれている場合は、そのエラー メッセージをトリガーした原因を調査します。

コード カバレッジの状態チェックが完了しない場合や失敗した場合はどうすればよいですか?

コード カバレッジの状態チェックを有効にするには、リポジトリのルートに azurepipelines-coverage.yml ファイルを追加してみてください。 ファイル名が完全に同じであることを確認します。 次に例を示します。

coverage: 
  status: 
    comments: on 
    diff: 
      target: 50% 

カバレッジの状態チェックが失敗している場合:

  1. 差分カバレッジ率を確認してください。 ターゲットより小さい場合は、差分カバレッジの割合を上げてみてください。
  2. 何らかの理由でビルドが失敗した場合、このエラーによってコード カバレッジの状態チェックが失敗する可能性もあります。
  3. パイプラインでカバレッジ ファイルまたはレポートを生成するタスクを確認します。 タスクがカバレッジ レポートまたはファイルを適切にアップロードしているかどうかを確認します。
  4. 差分カバレッジ コメントに "実行可能な変更なし" または "コード カバレッジ データが見つかりません" と表示される場合は、行の削除、空白の挿入、またはコメントの追加が原因となることがあります。 これらのケースは実行不可能な変更であり、重要ではありません。そのため、コード カバレッジでは報告されません。

一部の DLL をコード カバレッジから除外するにはどうすればよいですか?

コード カバレッジからファイルを除外するには、 ExcludeFromCodeCoverageAttribute クラスを使用します

複数のサマリー ファイルをマージして、コード カバレッジの概要を適切な詳細と共に公開するにはどうすればよいですか?

コード カバレッジ V1 の発行タスクでは、入力として複数の概要ファイルがサポートされていません。 代わりに、複数のファイル形式をサポートするコード カバレッジ V2 の発行タスクを使用します。

レポート ジェネレーター タスクを使用して、すべての.xml ファイルをマージし、生成された XML パスを入力としてコード カバレッジの発行タスクに渡すこともできます。

コード カバレッジ チェックをトリガーするにはどうすればよいですか?

.html ファイルの場合、カバレッジの状態チェックはサポートされていません。 ビルド品質チェック タスクを使用して、コード カバレッジの結果を確認します。

[コード カバレッジ] タブのレポートに不正確な数値が含まれている

タブに表示されるデータは、カバレッジ ファイルから取得されます。 カスタム タスクを使用してコード カバレッジ ファイルを生成する場合は、ファイルに DLL またはファイルがないかどうかを確認します。

コードカバレッジポリシーが固まっています。その原因は何でしょうか?

いくつかの要因によって、この問題が発生する可能性があります。

  • 正しくないブランチ ポリシー名の形式: パイプライン名がブランチ ポリシー名と一致し、余分な文字がないことを確認します。

    [ポリシー] タブと強調表示されたブランチ ポリシー名を示すスクリーンショット。パイプライン名と一致することを確認します。

  • PublishCodeCoverage V1 の使用: コード カバレッジ ポリシーがスタックし、コメントは生成されません。 代わりに PublishCodeCoverage V2 タスクを使用してください。

  • PR 内のファイルが多すぎます:PR に 100 を超えるファイルがある場合、カバレッジ ポリシーは停止します。

  • 複数のカバレッジ ポリシー: 複数のカバレッジ ポリシーを構成すると、そのうちの 1 つがスタックします。 1 つのポリシーのみを構成し、もう一方のスタック ポリシーを削除します。

テストを追加した後でも、PR の 0% 差分カバレッジが表示される

PR で変更されたコード行や新しいコード行を対象にテストを追加しても、依然として 0% の差分カバレッジが表示される場合は、対処方法を確認してください。

  1. 新しく追加されたテストがビルドの一部として実行されることを確認します。
  2. テストが実行されない場合は、構成を確認して更新し、ビルドに含めるようにします。テストが実行されないとカバレッジを計算できないためです。

カバレッジ レポートが公開されているのに、PR に差分カバレッジ コメントが表示されない

いくつかの要因によって、この問題が発生する可能性があります。

  • タスクのバージョン: 差分カバレッジ コメントは、コード カバレッジ V2 の発行でのみサポートされます。
  • 実行可能な変更なし: 実行可能コードが変更されたファイルに対して差分カバレッジ コメントが生成されます。 PR に構成の更新プログラムしかない場合、Azure DevOps では、ビルド中に実行されるすべてのテストに基づいてコード カバレッジが表示されることがありますが、計算する差分カバレッジがない可能性があります。
  • カバレッジ形式: 機能コードの変更があり、コメントが生成されない場合は、パイプラインによって、この記事の冒頭で説明したサポートされている形式のいずれかでカバレッジ レポートが生成されることを確認します。

[コード カバレッジ] タブに、適切な HTML レポートが表示されない

.html レポートの生成に問題がある場合、システムは簡略化されたビューにフォールバックします。

[Code Coverage]\(コード カバレッジ\) タブとモジュールの一覧とカバレッジ グラフのビジュアル インジケーターを示すスクリーンショット。これはフォールバックの簡略化されたビューです。

pull request でコード カバレッジを検証するために、どのカバレッジ ツールと結果形式を使用できますか?

現時点では、Visual Studio Code カバレッジ (.coverage) 形式のみを使用して、プル要求のコード カバレッジを検証できます。 Visual Studio テスト タスク、.NET Core タスクのテスト動詞、テスト結果の発行タスクの TRX オプションを使用してコード カバレッジを発行する場合は、この形式を使用します。

プル要求が発生したときに複数のパイプラインがトリガーされた場合、カバレッジはパイプライン間でマージされますか?

プル要求が発生したときに複数のパイプラインがトリガーされた場合、コード カバレッジはマージされません。 この機能は現在、プル要求のコード カバレッジを収集して発行する 1 つのパイプライン用に設計されています。 パイプライン間でカバレッジ データをマージする必要がある場合は、Developer Community で機能要求を送信します。