Провалить модульные тесты, если покрытие ниже определенного процента

Я делаю make-файл, который запускает go test -cover. Можно ли не выполнить команду make unit_tests, если покрытие ниже X? Как бы я это сделал?

Не как часть инструмента «go test», но это можно сделать с помощью внешней команды.

Flimzy 01.05.2018 18:59

Вы можете создать свой собственный тестовый раннер, используя пакет тестирования, и у него есть функция покрытия, которую вы можете вызвать. golang.org/pkg/testing/#Coverage

Not_a_Golfer 01.05.2018 21:35
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
8
2
2 632
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого вы можете использовать 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 () в каждый пакет и устанавливать требования к покрытию для каждого пакета.

Aman 02.05.2018 02:54

Кажется, что нужно писать больше кода Go, чтобы поддерживать это. Можно подумать, что между go test -cover и go tool cover существует простой способ получить общий процент покрытия для модуля из оболочки.

Alex Jansen 11.12.2019 09:56

@AlexJansen для меня звучит как отличный пул-реквест :)

Not_a_Golfer 11.12.2019 18:52

Другие вопросы по теме