Go coverage は build tag テストの有無で package 対象を分ける
Go
Makefile
テスト
Go の coverage を unit test と integration test で分けたい場合、単に通常実行から -tags=integration を外すだけでは不十分なことがある。//go:build integration のテストファイルは実行されないが、その package の通常ビルド対象コードは coverage の分母に入るため、integration test でしか通らない repository / DB 境界などの実装が unit coverage を押し下げる。
判断基準:
- integration test 専用の package があり、通常 coverage の数字を unit test の指標として使いたいなら、通常 coverage の package リストから integration test ファイルを持つ package を除外する。
- integration coverage は逆に、integration test ファイルを持つ package だけを
-tags=integration付きで実行する。これで「unit coverage」と「integration 対象 package の coverage」を別の指標として読める。 go listのIgnoredGoFilesには build tag で通常ビルドから除外されたファイルが入るため、*_integration_test.goを含む package の検出に使える。
注意点: package 単位で除外するため、同じ package に unit test と integration test を混在させている場合、その package の unit test も通常 coverage から外れる。厳密に分けたいなら、integration test を repository など境界ごとの package に寄せるか、coverage 対象の設計を明示する。
検証方法: coverage ターゲットを dry-run して、通常 coverage に integration test を持つ package が含まれていないこと、integration coverage が該当 package だけを対象にしていることを確認する。その後、両方の coverage を実行し、分母の違いにより total が分かれて出ることを確認する。