Я делаю make-файл, который запускает go test -cover
. Можно ли не выполнить команду make unit_tests
, если покрытие ниже X? Как бы я это сделал?
Вы можете создать свой собственный тестовый раннер, используя пакет тестирования, и у него есть функция покрытия, которую вы можете вызвать. golang.org/pkg/testing/#Coverage
Для этого вы можете использовать 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()
, ниже, чем в отчете теста. Я просмотрел код, и функция вычисляет его покрытие иначе, чем внутренняя отчетность теста. Я не уверен, что более «правильно».
Потрясающе, это отлично работает в зависимости от охвата пакета за пакетом. Есть ли способ заставить его запускать все тесты в пакетах, чтобы мне не нужно было копировать TestMain () в каждый пакет и устанавливать требования к покрытию для каждого пакета.
Кажется, что нужно писать больше кода Go, чтобы поддерживать это. Можно подумать, что между go test -cover
и go tool cover
существует простой способ получить общий процент покрытия для модуля из оболочки.
@AlexJansen для меня звучит как отличный пул-реквест :)
Не как часть инструмента «go test», но это можно сделать с помощью внешней команды.