Go 言語でカバレッジの合格ラインを指定したい
go test -cover
でカバレッジ率が低くてもステータス 0(ゼロ)で正常終了してしまう。$ # カバレッジ付きでユニットテストを実行する $ go test -cover ./src ok github.com/KEINOS/sample/src coverage: 62.5% of statements $ # ステータス 0 で正常終了してしまう $ echo $? 0
「
n パーセント以下は失敗
」もしくは「n% より高い場合にパスさせる
」といった、指定したパーセンテージよりカバレッジが低い場合にステータス 1 で終了させたい。
Golang に標準装備されているユニット・テストで、カバレッジを表示させる際に、カバー率が低い場合に失敗させたかったのです。Travis CI や GitHub Actions などの CI とか。
「go test cover カバレッジ パーセンテージ 指定」とググってもカバレッジの説明ばかりで、カバレッジの合格ラインの指定方法について分からなかったので、自分のググラビリティとして。
TL; DR (今北産業)
-
go test
の-cover
は合格ラインを指定するオプションを持っていません。(Go v1.15.2 現在) -
cover
モードが有効時testing. Coverage()
でカバー率を取得できます。 -
TestMain()
に条件文を組み込むことでパーセンテージを指定することができます。
TS; DR
メインのテストに以下を指定
package (
"fmt"
"testing"
)
// カバー率(0.8 以上で合格)
var thresholdCoverage = 0.8
func TestMain(m *testing.M) {
var returnCode = m.Run()
if returnCode == 0 && testing.CoverMode() != "" {
var rateCoverage = testing.Coverage()
if rateCoverage < thresholdCoverage {
fmt.Println("テストはパスしましたが。カバレッジに失敗しました。カバレッジ率:", rateCoverage)
returnCode = -1
}
}
os.Exit(returnCode)
}
- 動作確認: Go v1.15.2 @ Alpine Linux v3.12
- 参考文献: 回答 | "fail unit tests if coverage is below certain percentage" @ StackOverflow
参考文献
-
func CoverMode()
| Testing @ golang.org 公式ドキュメント - fail unit tests if coverage is below certain percentage @ StackOverflow
- Go 1.15 testing パッケージの TestMain は os.Exit を呼ばなくてよくなった @ Qiita