I want to track test coverage on a go project using Coveralls, the instructions for the integration reference using https://github.com/mattn/goveralls
cd $GOPA
Has anyone figured out how to get coverage for multiple packages?
Note: with Go 1.10 (Q1 2018), that... will actually be possible.
See CL 76875
cmd/go
: allow-coverprofile
with multiple packages being tested
You can see the implementation of a multiple package code coverage test in commit 283558e
Jeff Martin has since the release of Go 1.10 (Feb. 2018) confirmed in the comments:
go test -v -cover ./pkgA/... ./pkgB/... -coverprofile=cover.out
gets a good profile and go tool cover -func "cover.out"
will get a total: (statements) 52.5%
.So it is working!
I have been using http://github.com/axw/gocov to get my code coverage.
I trigger this in a bash script, in here I call all my packages.
I also use http://github.com/matm/gocov-html to format into html.
coverage)
echo "Testing Code Coverage"
cd "${SERVERPATH}/package1/pack"
GOPATH=${GOPATH} gocov test ./... > coverage.json
GOPATH=${GOPATH} gocov-html coverage.json > coverage_report.html
cd "${SERVERPATH}/package2/pack"
GOPATH=${GOPATH} gocov test ./... > coverage.json
GOPATH=${GOPATH} gocov-html coverage.json > coverage_report.html
;;
Hope that helps a little bit.
I ended up using this script:
echo "mode: set" > acc.out
for Dir in $(find ./* -maxdepth 10 -type d );
do
if ls $Dir/*.go &> /dev/null;
then
go test -coverprofile=profile.out $Dir
if [ -f profile.out ]
then
cat profile.out | grep -v "mode: set" >> acc.out
fi
fi
done
goveralls -coverprofile=acc.out $COVERALLS
rm -rf ./profile.out
rm -rf ./acc.out
It basically finds all the directories in the path and prints a coverage profile for them separately. It then concatenates the files into one big profile and ships them off to coveralls.
Here is a pure GO solution:
I create a library that may help, https://github.com/bluesuncorp/overalls
all it does is recursively go through each directory ( aka each package ), run go test and produce coverprofiles, then merges all profiles into a single one at the root of the project directory called overalls.coverprofile
then you can use a tool like https://github.com/mattn/goveralls to send it to coveralls.io
hope everyone likes
In Go 1.13, following command generates coverage for multiple packages
go test -v -coverpkg=./... -coverprofile=profile.cov ./...
go tool cover -func profile.cov
for html report
go tool cover -html=profile.cov -o cover.html
Taking Usman's answer, and altering it to support skipping Godep and other irrelevant folders:
echo "mode: set" > acc.out
for Dir in $(go list ./...);
do
returnval=`go test -coverprofile=profile.out $Dir`
echo ${returnval}
if [[ ${returnval} != *FAIL* ]]
then
if [ -f profile.out ]
then
cat profile.out | grep -v "mode: set" >> acc.out
fi
else
exit 1
fi
done
if [ -n "$COVERALLS_TOKEN" ]
then
goveralls -coverprofile=acc.out -repotoken=$COVERALLS_TOKEN -service=travis-pro
fi
rm -rf ./profile.out
rm -rf ./acc.out
Notice that instead of looking at every directory, I us the go list ./...
command which lists all directories that actually get used to build the go package.
Hope that helps others.
** EDIT **
If you are using the vendor
folder for Go v.1.6+ then this script filters out the dependencies:
echo "mode: set" > acc.out
for Dir in $(go list ./...);
do
if [[ ${Dir} != *"/vendor/"* ]]
then
returnval=`go test -coverprofile=profile.out $Dir`
echo ${returnval}
if [[ ${returnval} != *FAIL* ]]
then
if [ -f profile.out ]
then
cat profile.out | grep -v "mode: set" >> acc.out
fi
else
exit 1
fi
else
exit 1
fi
done
if [ -n "$COVERALLS_TOKEN" ]
then
goveralls -coverprofile=acc.out -repotoken=$COVERALLS_TOKEN -service=travis-pro
fi