導入
Go言語での開発において、テストカバレッジの計測は品質担保の要です。しかし、全体的なパーセンテージだけを見て満足していませんか?「全体では80%あるが、重要なビジネスロジックを含む特定の関数が全くテストされていない」といった事態は珍しくありません。本記事で解説する go tool cover -func を活用すれば、関数単位で網羅率を可視化でき、どのコードが「テストの死角」になっているかを一撃で特定できるようになります。
基礎知識
Goには標準で強力なテストツールが備わっています。テスト実行時に -coverprofile オプションを付与すると、コードのどの行が実行されたかという情報がバイナリファイルに書き出されます。この情報を人間が読める形式に変換し、関数ごとに集計して表示するのが go tool cover -func です。
このツールを使うことで、テスト不足の関数をピンポイントで見つけ出し、リファクタリングやテスト追加の優先順位を論理的に決定できるようになります。
実装/解決策
具体的な手順は非常にシンプルです。以下の3ステップで実行します。
1. プロファイルデータの生成:テストを実行し、カバレッジ情報をファイルに出力します。
2. 集計結果の表示:生成されたファイルを元に、関数単位の網羅率を一覧表示します。
3. 課題の特定:出力されたリストのパーセンテージを確認し、低いものを改善対象とします。
このワークフローをCI/CDパイプラインに組み込むことで、カバレッジの低下を自動検知することも可能です。
サンプルプログラム
以下の手順で、実際にプロジェクト内で確認を行ってみてください。まずは、カバレッジを取得するためのコマンド実行例です。
// 1. カバレッジプロファイルを作成するコマンド
// go test ./… -coverprofile=coverage.out
// 2. 関数ごとのカバレッジを表示するコマンド
// go tool cover -func=coverage.out
以下は、このツールをより便利に使うためのTipsを含むサンプル的なディレクトリ構成と実行フローです。
// [実行例]
// ターミナルで以下のコマンドを打つと、関数単位の一覧が詳細に表示されます
// $ go tool cover -func=coverage.out
// 出力結果のイメージ:
// pkg/service/user.go:10: CreateUser 60.0%
// pkg/service/user.go:25: DeleteUser 100.0%
// total: (statements) 80.5%
// ポイント:
// 網羅率が低い関数だけを抽出したい場合は、grepを組み合わせるのが実務的です
// $ go tool cover -func=coverage.out | grep -v “100.0%”
応用・注意点
現場で運用する際に意識すべき注意点がいくつかあります。
・テストの品質を混同しない:カバレッジはあくまで「通った行」を示す指標です。100%であっても、アサーション(期待値の検証)が不十分であればバグは見抜けません。カバレッジは「テストが書かれていない場所を見つけるためのツール」として使いましょう。
・外部パッケージの除外:デフォルトではサードパーティライブラリも含めて集計されることがあります。自身のプロダクトコードに集中するため、./… のようにパッケージ指定を適切に行うことが重要です。
・自動化の罠:カバレッジの数値を目標にすると、無理にテストを通すための「意味のないテスト」が増えがちです。あくまで「コードの健全性を保つための補助ツール」という立ち位置をチーム内で共有してください。
このツールを日々の開発サイクルに組み込むだけで、テストコードのメンテナンス性が劇的に向上します。ぜひ次回のプルリクエスト作成前に一度確認してみてください。

コメント