
# Code Coverage

Code Coverage は、テストが実際にコードのどれだけを実行しているかを示します。CI でテストスイートを実行し、レポートをアップロードすると、Aikido でリポジトリ、ファイル、行ごとのカバレッジを確認できます。カバレッジが指定した割合を下回ったときに GitHub のプルリクエストを失敗させるには、[PR Gating on Code Coverage](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage/pr-gating-on-code-coverage) を参照してください。モノレポでは、すべてのアプリでカバレッジを実行してアップロードしてください。変更のないアプリをスキップする方法については、[Monorepos That Test Only Changed Paths](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage/monorepos-that-test-only-changed-paths) を参照してください。

## 仕組み

1. CI ジョブがカバレッジを有効にしてテストを実行し、1 つ以上のカバレッジレポートを書き出します。
2. CI がそのレポートを Aikido にアップロードします。手順はプラットフォームによって異なります。[カバレッジレポートのアップロード](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage#upload-a-coverage-report)を参照してください。
3. Aikido はレポートをリポジトリ、コミット SHA、ブランチに紐づけて保存します。
4. **Code Coverage** タブには、そのリポジトリとブランチの最新のアップロードが表示されます。新しいアップロードは以前のものを置き換えます。新しいレポートに含まれないファイルは削除されます。

## Aikido が測定する対象

Aikido は、アップロードされたレポートをリポジトリ内のすべてのファイルと比較するわけではありません。CI がアップロードしたカバレッジレポートに含まれるファイルのみを集計し、一覧表示します。

つまり、次のようになります。

* **Code Tree** と **File List** には、リポジトリ全体の一覧ではなく、そのレポートに含まれるファイルが表示されます。
* リポジトリのカバレッジ率は、**そのレポート内の**カバーされた行数を総行数で割ったものです。
* テストランナーが計測対象にしなかったファイルは、0% のカバーされていないファイルとしては表示されません。単に表示されないだけです。

Aikido は、接続されたリポジトリを使用してアップロードを正しいリポジトリに紐づけ、レポートに既に含まれているファイルの行レベルのプレビュー用にソースを取得します。レポートで省略されたファイルを補うためにリポジトリを走査することはありません。

### テストが収集したファイルが表示されます

コードツリーとカバレッジ率はレポートに従います。テストランナーは通常、リポジトリの一部のみを計測します。Jest の `collectCoverageFrom`、pytest の `--cov=src`、Istanbul の `include` は、多くの場合 `src/` を収集し、テスト、生成ファイル、その他のフォルダーを除外します。そのレポートをアップロードすると、Aikido には `src/` が表示されます。割合は、カバーされた行数をレポート内の行数で割ったものです。

リポジトリのより多くの部分を表示するには、これらの collect または include のパスを広げて再度アップロードしてください。パッケージやジョブごとにレポートを書き出す場合は、すべてのパスを 1 回のアップロードで渡してください。Aikido は、そのアップロード内の LCOV および Cobertura レポートを 1 つの結果にマージします。後のアップロードでは、以前のアップロードのファイルは保持されません。コミットごとにすべてのアプリを実行してください。変更のないアプリをスキップする方法については、[Monorepos That Test Only Changed Paths](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage/monorepos-that-test-only-changed-paths) を参照してください。

## ユースケース

* **テストが不十分なリポジトリを把握する:** Aikido に接続されたリポジトリ全体で全体のカバレッジを比較します。
* **コードベースのギャップを見つける:** リポジトリを開き、コードツリーまたはファイルリストでカバーされていないファイルを閲覧します。
* **変更前にファイルを確認する:** ソースに対する行レベルのカバレッジを開き、既存のテストが何をカバーしているかを把握します。
* **カバレッジが改善しているかを追跡する:** テストの追加やデッドコードの整理に合わせて、カバレッジの推移を活用します。
* **カバレッジを品質改善と組み合わせる:** [リポジトリスキャン](https://help.aikido.dev/docs/docs-ja/code-quality/repository-scans)や[PR チェック](https://help.aikido.dev/docs/docs-ja/code-quality/code-quality-setup)でファイルが指摘された場合、そのファイルがテストされているかを確認します。

## 前提条件

開始する前に、次の点を確認してください。

* **Basic**、**Pro**、**Advanced**、または **Enterprise** プランを利用していること。Code Coverage は Developer プランでは利用できません。
* リポジトリが [Aikido に接続されている](https://help.aikido.dev/docs/docs-ja/code-scanning/connect-your-source-code)こと。
* テストがカバレッジレポートを生成すること。Aikido は [LCOV](https://github.com/linux-test-project/lcov)（`lcov.info`）と [Cobertura](https://cobertura.github.io/cobertura/) XML に対応しています。Jest と pytest-cov はネイティブで LCOV を書き出せます。その他のランナーも、LCOV または Cobertura をエクスポートできれば利用できます。

## カバレッジレポートのアップロード

テストがカバレッジレポートを書き出したら、お使いの CI プラットフォーム用のインテグレーションでアップロードします。GitHub Actions、GitLab CI、Bitbucket Pipelines、Azure DevOps は OIDC で認証するため、これらのジョブでは API トークンは不要です。Jenkins、CircleCI、その他のカスタム CI では、CI API トークンを使用して CI API クライアントを利用します。

各ガイドでは、アップロード手順、複数のレポート、並列またはマトリックスジョブ、リージョン、すべての入力項目について説明しています。

* **GitHub Actions:** [Aikido Code Coverage GitHub Action](https://github.com/AikidoSec/code-coverage-github-action)
* **GitLab CI:** [Aikido Code Coverage GitLab CI component](https://gitlab.com/aikido-security/code-coverage-gitlab-action)
* **Bitbucket Pipelines:** [Aikido Code Coverage Bitbucket pipe](https://bitbucket.org/aikido-production/code-coverage-bitbucket-pipeline/src/main/README.md)
* **Azure DevOps:** [Aikido Code Coverage Azure Pipeline](https://marketplace.visualstudio.com/items?itemName=AikidoSecurity.aikido-code-coverage-task)
* **カスタム CI:** Jenkins、CircleCI、その他のランナー向けの [Aikido CI API client](https://www.npmjs.com/package/@aikidosec/ci-api-client)

## Aikido でカバレッジを表示する

次のアップロードが成功した後:

1. [**Code Quality** > **Code Coverage**](https://app.aikido.dev/code-quality/code-coverage) を開きます。
2. リポジトリ一覧を検索します。各行には、全体のカバレッジと最終更新日時が表示されます。
3. リポジトリを開くと、次の内容を確認できます。
   * **カバレッジの概要**: カバー済み、部分的、カバーされていない行数
   * **カバレッジの推移**: アップロードごとの割合の変化
   * **ファイル**: **Code Tree** またはフラットな **File List** として閲覧
4. ファイルを開いて、ソースに対する行レベルのカバレッジを確認します。

ソースのプレビューは、Aikido がファイルをインポート済みであるかどうかに依存します。ソースがまだ利用できない場合でも、ファイルリストにはカバレッジ率が表示されます。

<div data-with-frame="true"><figure><img src="https://help.aikido.dev/_assets/ac08153cc727/code-coverage-overview.png" alt=""><figcaption><p>Code Coverage では、リポジトリレベルの推移とファイルごとのカバレッジを 1 つのビューで確認できます。</p></figcaption></figure></div>

## トラブルシューティング

* **Aikido に何も表示されない**: リポジトリが Aikido に接続されていること、カバレッジレポートに解析可能なソースファイルが少なくとも 1 つ含まれていること、アップロード手順が実行されたことを確認してください。
* **`/src`（または別のフォルダー）しか表示されない**: アップロードされたレポートにそれらのパスしか含まれていません。[テストが収集したファイルが表示されます](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage#you-see-the-files-your-tests-collected)を参照してください。
* **カバレッジが不完全に見える**: テストをシャーディングしたりマトリックスを使用したりしている場合は、コミットごとに 1 回のアップロードですべてのレポートを送信してください。すべてのレポートパスを渡すか、先にアーティファクトを収集してからまとめてアップロードしてください。
* **実行されなかったアプリが消えた**: 最新のアップロードが以前のものを置き換えました。すべてのアプリを実行し、すべてのレポートをアップロードしてください。変更のないアプリをスキップするには、各アプリの最新のレポートを保持し、まとめてアップロードしてください。[Monorepos That Test Only Changed Paths](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage/monorepos-that-test-only-changed-paths) を参照してください。
* **レポートがサイズ超過で拒否される**: Aikido が受け付けるカバレッジペイロードは最大 10 MB です。アップロード前にカバレッジの出力を絞り込むか、生成ファイルを除外してください。
* **アップロード手順が失敗する**: [カバレッジレポートのアップロード](https://help.aikido.dev/docs/docs-ja/code-quality/code-coverage#upload-a-coverage-report)にあるお使いのプラットフォーム向けのガイドに従ってください。

## お困りですか？

右下の **Intercom チャット**を開いてください。私たちのチームがサポートいたします。
