Вы можете использовать TestMain
в своем тесте, чтобы сделать это. TestMain может выступать в качестве пользовательской точки входа в тесты, а затем вы можете вызвать testing.Coverage()
, чтобы получить доступ к статистике покрытия.
Так, например, если вы хотите потерпеть неудачу на уровне ниже 80%, вы можете добавить это к одному из тестовых файлов вашего пакета:
func TestMain(m *testing.M) {
// call flag.Parse() here if TestMain uses flags
rc := m.Run()
// rc 0 means we've passed,
// and CoverMode will be non empty if run with -cover
if rc == 0 && testing.CoverMode() != "" {
c := testing.Coverage()
if c < 0.8 {
fmt.Println("Tests passed but coverage failed at", c)
rc = -1
}
}
os.Exit(rc)
}
Тогда go test -cover
вызовет эту точку входа, и у вас не получится:
PASS
coverage: 63.0% of statements
Tests passed but coverage failed at 0.5862068965517241
exit status 255
FAIL github.com/xxxx/xxx 0.026s
Обратите внимание, что число, которое возвращает testing.Coverage()
, меньше, чем то, что сообщает тест. Я посмотрел на код, и функция вычисляет его охват не так, как внутренние отчеты теста. Я не уверен, что является более "правильным".