はじめに
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
無料プランでもまあまあ運用できる
無料プランだと、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のジョブにおいて参照させる形になるでしょう。
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も同様にフラグをつける。