Codecovを使って、CIで手軽にカバレッジレポートを出す

# はじめに

Codecovというサービスを使うと、テストのカバレッジを手軽に可視化することができます。CIと連携させるのも簡単で、無料プランでもそこそこ運用できるのが便利です。

https://codecov.io/


# Codecovの概要

色々な言語の色々なテスティングツールが出力するカバレッジレポートファイルを受け取って、カバレッジを可視化するサービスです。ファイルを受け取って可視化する部分がCodecovの範疇であり、言語やテスティングツールには非依存です。

Codecovは色々な形式のファイルを受け付けられます。大体のテスティングツールは、Codecovが受け付けられる何らかのファイル形式を出力できるはずです。

サポートしている言語はこちら：https://docs.codecov.io/docs/supported-languages
サポートしているファイル形式はこちら：https://docs.codecov.io/docs/supported-report-formats


# CIから呼び出せる

Codecovは色々なCIサービスから呼び出せます（それに限定されるわけでもないです）。
https://docs.codecov.io/docs/supported-ci-providers

典型的な利用形態としては、CIのジョブの中でテストを実行し、出力されたカバレッジレポートファイルをCodecovにアップロードするといった流れでしょう。例えば、GitHub Actionsには[Codecov用のAction](https://github.com/codecov/codecov-action)が用意されています。

Codecovにファイルをアップロードする一番原始的な手段は、[Codecov Bash uploader](https://docs.codecov.io/docs/about-the-codecov-bash-uploader)というシェルスクリプトを使うことですが、それを直接使う必要はあまりないです。例えばGitHub Actionsを使っているなら、Codecov用のActionを呼べばOKです。そのActionが、内部でCodecov Bash uploaderを呼んでいるというわけです。


# PRコメントが便利

CIからCodecov呼び出すと、カバレッジ概要をPRにコメントしてくれます。詳細なレポートはCodecovのサイトで閲覧できますが、PRコメントだけでも結構事足ります。
https://docs.codecov.io/docs/pull-request-comments

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/a923f7e9-4ca5-da2a-10d3-d8e91fea0f2d.png)


# 無料プランでもまあまあ運用できる

無料プランだと、GitHubなどのOrganization 1個につき、ユーザー5人まで「有効化」できます。リポジトリ数は無制限です（privateでも）。
https://codecov.io/pricing

有効化されたCodecovユーザーでないと、Codecovのサイトにある詳細画面を閲覧できません。とはいえ、PRコメントだけでも事足りるので、無料プランでもまあまあ運用できる印象です。


# 自動的に行われるMerging Reports機能が便利

CodecovにはMerging Reportsという便利な機能が備わっています。設定不要で、自動的に行われます。
https://docs.codecov.io/docs/merging-reports

これは、1個のPRにおいて複数のテストスイートを実行する場合に役立ちます（例：単体テスト、結合テストなど）。どんなものかというと、各テストスイートの実行結果（カバレッジレポートファイル）をCodecovにそれぞれアップロードすれば、自動的にそれらをマージしたカバレッジを表示してくれるという機能です。

GitHub Actionsの例でいうと、1個のPRに対して複数のワークフローやジョブを用意していたとしても、それぞれにおけるテスト結果をただただCodecovにアップロードすればよいだけです。そうするだけで、全部の結果が出揃ってから、それらの結果がマージされたカバレッジが表示されます。


# 設定ファイルcodecov.ymlは、必要に応じて用意すればOK

Codecov自体の設定（特定のCIサービスに依存しない設定）はcodecov.ymlというファイルに書きます。デフォルトの設定だけでも動かせるので、codecov.ymlは必要に応じて用意すればOKです。

https://docs.codecov.io/docs/codecov-yaml
https://docs.codecov.io/docs/codecovyml-reference

デフォルトの設定だと、カバレッジが下がったときにCIが失敗したりします。このあたりはプロジェクトの事情に応じて適宜設定しましょう。

よく使う設定例がこちらにまとめられており、それを真似すると簡単です。
https://docs.codecov.io/docs/common-recipe-list


# Flagsを使うと、テストの種類ごとにカバレッジが出せる

Flagsという機能で、1個のPRに対する全テストをいくつかのサブグループに分割してカバレッジを出すこともできます。
https://docs.codecov.io/docs/flags

例えば、「リポジトリ全体のカバレッジはxx%で、バックエンド部分だけでいうとyy%、フロントエンド部分だけでいうとzz%」といった集計ができます。monorepo形式のプロジェクト等で役立ちそうです。

あるいは、単体テスト、結合テストといった切り口で分けるとか。


# Codecovを使い始める手順

Codecovには、GitHubなどのユーザーアカウントを使って簡単にサインアップできます。

画面に従って、サインアップなどをぽちぽちと済ませたら、ダッシュボードの画面に到着します。ここから、GitHubなどにあるリポジトリをCodecovに追加します。

すると、リポジトリに対してUpload Tokenなるものが発行されます（下図）。このトークンは、各種CIからCodecovを呼び出す際に必要になります。CIサービスにおいて秘匿情報を保管する場所にセットし、CIのジョブにおいて参照させる形になるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188748/8c7c1e11-9084-b194-233f-ba1f103b0018.png)

PRコメントが行われるようにするために、GitHubならCodecov用のGitHub Appをインストールします。
https://github.com/apps/codecov
GitHub以外なら、Team Botなるものを設定します。
https://docs.codecov.io/docs/team-bot

あとは、各種CIのジョブ設定の中で、テスト実行後にCodecovにアップロードするステップを挿入するだけです。例えばGitHub Actionsなら下記を使います。それほど難しい設定はなく、先ほどのUpload Tokenや、カバレッジレポートファイルのパスなどを指定するぐらいです。
https://github.com/codecov/codecov-action

ここまでできたら、いよいよPRを出すだけ！

# おまけ：GitHub Actionsの設定例

単純な例はこちら。

```yaml
# 前略

steps:
# 中略
- uses: codecov/codecov-action@v1
  with:
    token: ${{ secrets.CODECOV_TOKEN }}
    directory: coverage # このディレクトリに、テスティングツールによるカバレッジレポートファイルが出力される想定
```

---

monorepoのプロジェクトにおいて、パッケージ毎にフラグを付与し、パッケージ毎にカバレッジを出す例はこちら。

```yaml
# 前略

steps:
# 中略
- uses: codecov/codecov-action@v1
  with:
    token: ${{ secrets.CODECOV_TOKEN }}
    directory: packages/backend/coverage
    flags: backend # backendのディレクトリにあるカバレッジレポートには、"backend"というフラグをつける。
- uses: codecov/codecov-action@v1
  with:
    token: ${{ secrets.CODECOV_TOKEN }}
    directory: packages/frontend/coverage
    flags: frontend # frontendも同様にフラグをつける。
```