テストカバレッジ強制ギプスとは
- テストカバレッジが基準値以下ならマージをできなくしてしまう機構のこと (をこの記事で勝手にそう呼んでいます)
- この記事では、Go のプロジェクトを運用されている方を対象にテストカバレッジ強制ギプスを15分で導入できるように紹介します
- 具体的には、CI でテストカバレッジを計測して、基準値以下なら fail にさせるようにします
- テストカバレッジ強制ギプスを導入して、単体テストを充実させ快適な開発ライフを楽しみましょう
背景
私のチームでは、 Go を用いたバックエンドサービスの開発をしています。開発の中でいくつか気になることが出てきました。
- 自動テストがあれば検知できた不具合
- 開発コストの増大
様々な原因がある中で、その中でも単体テストが充実していないことが主要因であると分析しました。現状、問題となっているプロジェクトでは、 E2Eテスト > 単体テスト
のカバレッジになってしまい、 E2E テストのみで検証しているロジックが増えてしまっていました。そうすることで、以下のような状況が生まれ、先程の問題が発生していると解釈しました。
- 実装時のPDCAサイクルが大きくなり、実装手戻りが増える
- 既存のコードの修正にも時間が余分かかる
- テストによってカバーできていない領域が生まれ品質が低下する
これらの状況は品質の低下を招くとともに開発体験の悪化にも繋がります。この状況を改善するために、テストカバレッジ強制ギプスの導入をチームで実施することにしました。
テストカバレッジ強制ギプス導入前の注意
以下の点に注意してください
- "強制ギプス" は必ずしも全ての人を幸せにしない
- 特にすでにカバレッジが高いプロジェクトの場合は、「やり過ぎ」になる可能性もある
- 逆に、幸せになりやすいプロジェクトの特徴
- 保守の割合が高いプロジェクト
- 現状のテストカバレッジが低いプロジェクト
- チーム内ですでに単体テストが不足している認識があるプロジェクト
テストカバレッジ強制ギプス導入
では早速、テストカバレッジ強制ギプスを導入します。Go の標準ツールとbashのコマンドだけで実現していきます。
1. 現状のカバレッジ計測
- 対象の Go プロジェクトで以下のコマンドを実行
go test -v -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
- 出力の最終行に注目し、合計のカバレッジを確認
- 下の例の場合は
42.5%
なので、この値を現状のカバレッジとして記録しておく
- 下の例の場合は
出力例
=== RUN Test_feeling
...省略...
total: (statements) 42.5%
2. CI 設定
-
PR でトリガーされるジョブにテストカバレッジをチェックするステップを追加
-
go build
やgo test
を実施しているところがオススメです! - GithubActions の場合のサンプル
- CirlceCI の場合のサンプル
-
-
カバレッジの基準値を
1. 現状のカバレッジ計測
の値に変更- 42.5%に変更するための例:
declare -r limit=60
→declare -r limit=42.5
- 42.5%に変更するための例:
サンプル
go test -v -coverprofile=coverage.out ./...
go tool cover -func=coverage.out > report.out
# ... コメント省略 ...
# coverage rate limit
declare -r limit=60 # ← ここの値を "1. 現状のカバレッジ計測" で得た値に変更してください
if (( $(cat report.out | awk 'END{gsub("%", "", $3); print ($3 < '$limit')}') )); then
echo 'Coverage is below the lower limit! Failed!'
exit 1;
fi
これでテストカバレッジ強制ギプスの導入は完了です!
(CIの設定がまだない人向け)
GitHub Actions を設定しちゃいましょう!以下の手順でOKです。
-
.github/workflows/go.yaml
のファイルを作成し、こちらの中身をそのままコピー -
1. 現状のカバレッジ計測
で計測した値でこの行の数値を書き換える- 42.5%に変更するための例:
declare -r limit=60
→declare -r limit=42.5
- 42.5%に変更するための例:
3. <おまけ> 動作確認
最後に動作確認しておきましょう。
- 動作確認用のブランチを作成
- テストのないロジックを追加し、PRを作成
- CI が落ちていることを確認
まとめ
- 開発体験の悪化や品質の低下を防ぐために "テストカバレッジ強制ギプス" を導入しました
- サンプルレポジトリはこちらにあるのでご参考にしてください
- "テストカバレッジ強制ギプス" によって、現状のテストカバレッジが下がることを防ぐことができるようになります