Go: Неправильное покрытие при отсутствии тестов для пакета

У меня есть проект Go со следующей структурой:

foo/foo.go
foo/foo_test.go
main.go

Как вы заметили, нет теста на main.go.

Я собираю отчет о покрытии с помощью следующей команды:

go test ./foo ./ -coverprofile=coverage.txt -covermode=atomic

Вот ./foo а также ./ покажите, где искать пакеты.

Проблема: я отправляю на codecov.io отчет о покрытии, который показывает, что мой код на 100% покрыт тестами. Но это не так, поскольку мойmain.go вообще нет тестов.

Похоже, система учитывает только те пакеты, которые явно указывают тестовые файлы.

Вопрос: Как исправить отчет о покрытии таким образом, чтобы он учитывал информацию о непроверенных пакетах?

Примечание: вы можете найти мой проект на GitHub, а настоящая статистика здесь. У проекта другая структура, но проблема не устранена (неправильное освещение).

2 ответа

Решение

В -coverpkg Флаг может использоваться для указания пакетов, которые используются в качестве основы для анализа покрытия.

Цитата из Command go: Флаги тестирования:

-coverpkg pattern1,pattern2,pattern3
    Apply coverage analysis in each test to packages matching the patterns.
    The default is for each test to analyze only the package being tested.
    See 'go help packages' for a description of package patterns.
    Sets -cover.

Итак, в вашем конкретном примере это будет:

go test -coverpkg=.,./foo -coverprofile=coverage.txt -covermode=atomic . ./foo

Чтобы применить его для полного модуля / проекта, вы можете использовать:

go test -coverpkg=./... -coverprofile=coverage.txt -covermode=atomic ./...

Другой вариант - поместить "пустой" тестовый файл в папки пакетов, в которых на данный момент нет тестового файла. Таким образом, они будут естественным образом включены в анализ покрытия по умолчанию, но, очевидно, от них ничего не будет покрываться.

См. Соответствующее обсуждение на github:

cmd / go: go test -cover & go test -coverprofile всегда должен выводить покрытие #24570

Попробуй это:

go test -coverpkg=./... -race -coverprofile=coverage.txt -covermode=atomic ./..

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