19
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-29

はじめに

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

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が用意されています。

Codecovにファイルをアップロードする一番原始的な手段は、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

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

無料プランだと、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

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の設定例

単純な例はこちら。

# 前略

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

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

# 前略

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も同様にフラグをつける。
19
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?