Как измерить покрытие кода в Golang?

114

Кому-нибудь удалось создать покрытие кода для модульных тестов Go? Я не могу найти в Интернете инструмент для этого.

Георгий Ацев
источник

Ответы:

139

Обратите внимание, что Go 1.2 (Q4 2013, доступен rc1) теперь будет отображать результаты тестового покрытия :

Одной из основных новых функций go testявляется то, что теперь он может вычислять и с помощью новой, отдельно установленной go tool coverпрограммы " " отображать результаты покрытия тестами .

coverИнструмент является частью go.toolssubrepository . Его можно установить, запустив

$ go get golang.org/x/tools/cmd/cover

Инструмент обложки выполняет две функции.

  • Во-первых, когда go testустановлен -coverфлаг "", он запускается автоматически, чтобы переписать исходный код пакета и вставить операторы инструментария. Затем тест компилируется и запускается как обычно, и выдается базовая статистика покрытия:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

Во-вторых, для более подробных отчетов с помощью различных флагов «пройти тест» можно создать файл профиля покрытия, который go tool coverзатем может анализировать программа покрытия, вызванная с помощью « ».

Фрэнк Шеарар упоминает :

В последних версиях Go (19.09.2013) используются:

go test -coverprofile <filename> <package name>

Подробную информацию о том, как генерировать и анализировать статистику покрытия, можно найти, выполнив команды

$ go help testflag
$ go tool cover -help

Иван Черный упоминает в комментариях :

go test -coverprofile cover.outа затем
go tool cover -html=cover.outоткрывается cover.outв вашем браузере по умолчанию

Я даже не хочу ждать, пока откроется браузер, поэтому я определил этот псевдоним:

alias gc=grep -v -e " 1$" cover.out

То, что я просто ввести gc, и есть список всех строк не еще покрыты (здесь: с coverage.outлинии не заканчивается " 1«).

VonC
источник
2
Обратите внимание, что в последних версиях Go (19.09.2013) используетсяgo test -coverprofile <filename> <package name>
Фрэнк Шеарар
@FrankShearar Хорошо. Я включил ваш комментарий в ответ для большей наглядности.
VonC
go test -coverprofile cover.outа затем go tool cover -html=cover.out -o cover.htmlоткрыть cover.htmlв браузере
Иван Черный
@IvanBlack хороший момент. Я включил его в ответ для большей наглядности. Я также добавил псевдоним, который использую, чтобы быстро увидеть непокрытые строки.
VonC
1
@VonC go tool cover -html=cover.outавтоматически откроет браузер, но в моей системе это не работает. Я предпочитаю держать браузер открытым и при необходимости обновлять страницу.
Иван Черный
41

Go поставляется с отличным инструментом для тестирования и покрытия. Несмотря на то, что все инструменты Go хорошо документированы, go tool cover -helpя бы посоветовал прочитать статью The Cover story в официальном блоге Go . В нем много примеров, и я настоятельно рекомендую!

У меня есть эта функция в моем ~ / .bash_profile. (вы можете просто вставить его в терминал, чтобы попробовать).

cover () { 
    t="/tmp/go-cover.$$.tmp"
    go test -coverprofile=$t $@ && go tool cover -html=$t && unlink $t
}

Затем просто cdперейдите в папку проекта / пакета и введите cover. Это открывает визуальный инструмент в браузере, который показывает проверенный и непроверенный код для каждого файла в текущем пакете. Очень полезная команда! Я настоятельно рекомендую его для поиска того, что еще не на 100% протестировано! Показанные результаты для каждого файла. В раскрывающемся списке в верхнем левом углу вы можете увидеть результаты для всех файлов.

С помощью этой команды вы также можете проверить охват любого пакета, например:

cover fmt

Результатом этой команды в терминале будет:

ok      fmt 0.031s  coverage: 91.9% of statements

В дополнение к этому в вашем браузере вы увидите, что этот инструмент показывает красным все строки кода, которые не покрыты тестами:

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

Также можно просто сохранить файл покрытия html вместо того, чтобы открывать его в браузере. Это очень полезно в тех случаях, когда ваши тесты + покрытие выполняется с помощью инструмента CI, такого как Jenkins. Таким образом, вы можете обслуживать файлы покрытия с центрального сервера, и вся команда сможет видеть результаты покрытия для каждой сборки.

Павел Николов
источник
Фрагмент скопирован отсюда coderwall.com/p/rh-v5a/get-coverage-of-golang-test
Павел Николов
Интересно, протестирую. +1
VonC
Это круто! Спасибо, что поделился. Закончил переходом к тестовым сценариям, так как я хотел протестировать основной пакет в своей программе. Cheers
Джеймс О'Тул
11

В дополнение к хорошим ответам, приведенным выше, я считаю, что эти три строки являются самым простым способом получить его (включая все пакеты):

go test -v -coverprofile cover.out ./YOUR_CODE_FOLDER/...
go tool cover -html=cover.out -o cover.html
open cover.html

Обратите внимание, что в файле HTML вы найдете кнопку раскрывающегося списка, которая направит вас ко всем файлам.

Шэрон Кац
источник
5

Это прямо здесь , некоторые документы здесь .

$ go tool
6a
6c
6g
6l
addr2line
api
cgo
cov
dist
ebnflint
fix
gotype
nm
objdump
pack
pprof
prof
vet
yacc
$ go tool cov -h
usage: cov [-lsv] [-g substring] [-m minlines] [6.out args...]
-g specifies pattern of interesting functions or files
go tool cov: exit status 1
$

Я не использовал его, это все, что я знаю.

zzzz
источник
вам нужно установить его вручную? в моей локальной установке go (версия go1) его там нет.
oers
Я считаю, что он создается ./all.bash. Я не могу проверить банкомат, у меня нет выпуска, поскольку у меня есть ожидающий CL, но двоичная временная метка cov, которую я вижу в ~/go/pkg/tool/linux_amd64моей последней сборке Go за вчерашний день.
zzzz
Да, запустите ./all.bash, и он у вас будет. Спасибо за помощь, jnml!
Георгий Ацев
У меня проблемы с запуском на моей машине x86. Я попытался изменить main.c, как упоминалось в этой ветке: groups.google.com/group/golang-dev/browse_thread/thread/… Но он генерирует ошибку времени выполнения в другом месте. Я попробую на 64-битной машине.
Георгий Ацев
3

Если вы хотите видеть непокрытые строки по функциям непосредственно в терминале, я переписал для этой цели инструмент покрытия. Он доступен по адресу https://github.com/gregoryv/uncover .

использование

go get -u github.com/gregoryv/uncover/...
go test -coverprofile /tmp/c.out
uncover /tmp/c.out

Скриншот

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

точка7
источник
2

Если вы используете VSCode, эта функция поддерживается из коробки ( но по умолчанию отключена )

Просто включите тест при сохранении + отчеты о покрытии

https://github.com/microsoft/vscode-go/wiki/On-Save-features

Он даже покажет в вашем редакторе, какие строки не покрыты, что очень удобно.

Том Йоман
источник
2

Отчет о покрытии →

а) Запустите все тесты и включите покрытие -> go test ./... -coverprofile coverage.out

б) Получите покрытие для отдельных функций, а также общее покрытие → go tool cover -func coverage.out

c) См. покрытые и не охваченные вами строки → go tool cover -html=cover.out -o coverage.html. Откройте coverage.htmlсозданный таким образом файл в браузере и проанализируйте подробную информацию о покрытии.

Аман Манн
источник
1

Быстрый и простой способ - использовать инструмент покрытия, который поставляется со встроенным go:

$ go test -coverprofile cp.out // Выдает покрытие в одном лайнере в процентном отношении

После выполнения указанной выше команды, если вы хотите визуально увидеть покрытие кода (например, покрытые операторы, пропущенные и т. Д.)

Крышка инструмента $ go -html = cp.out

Примечание: вам необходимо выполнить указанные выше команды в папке, в которой вы хотите увидеть покрытие.

Баладжи Боггарам Раманараян
источник
1

Вдохновленный меню помощи и другими ответами на этот вопрос, просто запустите:

f=cover.out; if [ -f $f ]; then rm $f; fi; go test ./... -coverprofile $f && \
go tool cover -html $f && \
rm $f
+030
источник
0

Попробуйте использовать образ Docker с помощью gaia-docker / base-go-build .

Это образ Docker, содержащий все, что вам нужно для создания и тестирования покрытия. Выполнение тестового покрытия внутри контейнера Docker создает папку .cover с результатами тестового покрытия вашего проекта.

docker run --rm -v "$PWD":$PROJECT_PATH -w $PROJECT_PATH $BUILDER_IMAGE_NAME /go/script/coverage.sh

Сценарий тестового покрытия , работающий на все проекты папку и создает внутри .Накрыть папки JUnit и покрытие отчетов для каждой папки, и комбайна отчета охвата всех проектов испытаний.

Codecov также предлагает сценарий, который собирает результаты покрытия: несколько файлов

Эффи Бар-Шеан
источник
-1

Тестовое покрытие для Голанга

go get github.com/axw/gocov/gocov go get -u gopkg.in/matm/v1/gocov-html

Убедитесь, что он установлен правильно и у вас есть доступ с вашего терминала

Запустить тестовый пример

Если вы запустите тестовый пример, он будет перерисовывать файл .json на основе файла, вы получите отчет о покрытии кода в файле .html.

gocov test >your_Coverage_report.json

После того, как ваш тестовый пример будет выполнен, сгенерируйте отчет в файле .html, используя .json

gocov-html your_Coverage_report.json >your_Coverage_report.html

Ссылка

Инструмент покрытия GoTest для go lang

Инструмент отчета о тестировании Go

Альтернативный метод

Покрытие Go Native Test

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
Muthukumar Selvaraj
источник