Is it possible to post coverage for multiple packages to Coveralls?

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  

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

Tags:

Go

Coveralls