Basics
go test tests packages as it is stated below.
> go test -h
test [build/test flags] [packages] [build/test flags & test binary flags]
So given a package, go test runs both in package tests and outside package tests.
> go test github.com/haibin/coverage/person
ok github.com/haibin/coverage/person 0.007s
To list in package tests, run the following.
> go list -f '{{.TestGoFiles}}' github.com/haibin/coverage/person
[foo_test.go]
To list outside package tests, run the following.
> go list -f '{{.XTestGoFiles}}' github.com/haibin/coverage/person
[person_test.go]
Test Coverage
To show a summary of test coverage, run the following
> go test -cover github.com/haibin/coverage/person
ok github.com/haibin/coverage/person 0.005s coverage: 75.0% of statements
According to the go test doc on -coverpkg, The default is for each test to analyze only the package being tested. so the above command is the same as the below.
> go test -coverpkg github.com/haibin/coverage/person github.com/haibin/coverage/person
ok github.com/haibin/coverage/person 0.006s coverage: 75.0% of statements in github.com/haibin/coverage/person
Now we have some integration tests outside of the package github.com/haibin/coverage/person but we want to see how much more coverage those tests provide to the same package.
> go test -coverpkg github.com/haibin/coverage/person github.com/haibin/coverage/it
warning: no packages being tested depend on github.com/haibin/coverage/person
ok github.com/haibin/coverage/it 0.006s coverage: 25.0% of statements in github.com/haibin/coverage/person
We can run them together as below.
> go test -coverpkg github.com/haibin/coverage/person github.com/haibin/coverage/it github.com/haibin/coverage/person
ok github.com/haibin/coverage/it 0.005s coverage: 25.0% of statements in github.com/haibin/coverage/person
ok github.com/haibin/coverage/person 0.005s coverage: 75.0% of statements in github.com/haibin/coverage/person
So what is the total coverage? There might be some overlapping of tests in github.com/haibin/coverage/it and tests in github.com/haibin/coverage/person. Let’s generate coverage profile.
> go test -coverprofile=coverage.out -coverpkg github.com/haibin/coverage/person github.com/haibin/coverage/it github.com/haibin/coverage/person
cannot use test profile flag with multiple packages
We got this cannot use test profile flag with multiple packages error. So we have to run it one by one.
> go test -coverprofile=it.out -coverpkg github.com/haibin/coverage/person github.com/haibin/coverage/it
warning: no packages being tested depend on github.com/haibin/coverage/person
ok github.com/haibin/coverage/it 0.006s coverage: 25.0% of statements in github.com/haibin/coverage/person
> go test -coverprofile=person.out -coverpkg github.com/haibin/coverage/person github.com/haibin/coverage/person
ok github.com/haibin/coverage/person 0.006s coverage: 75.0% of statements in github.com/haibin/coverage/person
Then we merge the two profiles.
> github.com/wadey/gocovmerge
> gocovmerge person.out it.out > coverage.out
And we get the total coverage!
> go tool cover -func=coverage.out
github.com/haibin/coverage/person/person.go:4: Age 100.0%
github.com/haibin/coverage/person/person.go:9: Name 100.0%
github.com/haibin/coverage/person/person.go:14: City 100.0%
github.com/haibin/coverage/person/person.go:18: foo 100.0%
total: (statements) 100.0%