Если в вашем коде несколько пакетов. То, как работает покрытие go test, может сбивать с толку. Вот краткое руководство
Один пакет исходного кода, несколько тестовых пакетов
$ tree -L 1 . ├── my_pkg.go ├── my_pkg_impl.go ├── api_tests └── regression_tests
Весь исходный код в одном пакете. Но тесты определены в нескольких подпакетах. Нам нужен небольшой сценарий bash, чтобы получить объединенные данные о покрытии из всех этих тестов.
#!/usr/bin/env bash set -e echo "" > coverage.txt for d in $(go list ./... | grep -v vendor); do go test -coverprofile=profile.out -coverpkg=github.com/your/pkg $d if [ -f profile.out ]; then cat profile.out >> coverage.txt rm profile.out fi done
Пакет coverpkg должен быть тестируемым, вам нужно изменить его самостоятельно.
Один тестовый пакет, несколько пакетов с исходным кодом
. ├── my_test.go ├── sub_pkg1 └── sub_pkg2
Если есть только один тестовый пакет, но тестируется несколько пакетов (для которых нам нужны данные о покрытии). Мы можем запустить одну тестовую команду:
go test -coverprofile=profile.out -coverpkg=github.com/your/pkg/sub_pkg1,github.com/your/pkg/sub_pkg2 .
Параметр coverpkg использует запятую в качестве разделителя для указания нескольких целевых пакетов.
Несколько тестовых пакетов, несколько пакетов с исходным кодом
Просто объедините два упомянутых выше
#!/usr/bin/env bash set -e echo "" > coverage.txt for d in $(go list ./... | grep -v vendor); do go test -coverprofile=profile.out -coverpkg=github.com/your/pkg/sub_pkg1,github.com/your/pkg/sub_pkg2 $d if [ -f profile.out ]; then cat profile.out >> coverage.txt rm profile.out fi done
Показать покрытие с помощью веб-интерфейса
используя travis и codecov, все, что вам нужно, это
language: go go: - 1.8.x - 1.x before_install: - go get -t -v ./... script: - ./test.sh after_success: - bash <(curl -s https://codecov.io/bash)
test.sh - это сценарий bash, который мы создали выше.