How to detect code-coverage of separated folders in GO?

My project-structure
stuff/stuff.go -> package: stuff
test/stuff/stuff_test.go -> package: test
Although stuff_test executes code from stuff.go it shows
coverage: 0.0% of statements

I used go test -cover
If I move my *_test.go to the stuff-folder of the program it is working fine.
Or perhaps my approach of the project-structure is not well designed/go-conform?

Upvotes: 10

Views: 2823

Answers (3)

Peter Zeller
Peter Zeller

Reputation: 2296

You can use the -coverpkg option to select the packages for which to record coverage information.

From the output of go help testflag:

-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.

For example:

go test ./test/... -coverprofile=cover.out -coverpkg ./...

Then view the report with:

go tool cover -html=cover.out

Upvotes: 6

Rob Napier
Rob Napier

Reputation: 299643

Cross-package test coverage is not directly supported, but several people have built wrappers to merge individual coverage profiles.

See Issue #6909 for the long history on this. And see gotestcover for an example tool to do the merging. There's also gocovmerge. I built my own version, so I haven't tried any of these, but I'm sure they all work like mine, and mine works fine.

My sense is that this is just an issue that no one has written a really compelling changelist for, and hasn't been that important to the core maintainers, so it hasn't been addressed. It does raise little corner cases that might break existing tests, so the quick hacks that work for most of us haven't been accepted as-is. But I haven't seen any discussion suggesting the core maintainers actively object to this feature.

Upvotes: 5

saarrrr
saarrrr

Reputation: 2897

Conventional Go program structure keeps the tests with the package. Like this:

project
|-stuff
|--stuff.go
|--stuff_test.go

At the top of your testing files you still declare package stuff, and it is required that your test methods take the form TestMethodX if you want go test to automatically run them.

See Go docs for details: https://golang.org/pkg/testing/

Upvotes: 5

Related Questions