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