Если в вашем коде несколько пакетов. То, как работает покрытие 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, который мы создали выше.