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


person Sasha Shpota    schedule 24.01.2020    source источник
comment
Это решает вашу проблему? go test -coverpkg=.,./foo -coverprofile=coverage.txt -covermode=atomic . ./foo   -  person icza    schedule 25.01.2020


Ответы (2)


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

Цитата из Команда 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

person icza    schedule 25.01.2020

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

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

введите здесь описание изображения

person Prakash Kumar    schedule 24.01.2020