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

前端 未结 6 628
故里飘歌
故里飘歌 2021-02-04 10:02

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         


        
相关标签:
6条回答
  • 2021-02-04 10:23

    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!

    0 讨论(0)
  • 2021-02-04 10:32

    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.

    0 讨论(0)
  • 2021-02-04 10:38

    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.

    0 讨论(0)
  • 2021-02-04 10:39

    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

    0 讨论(0)
  • 2021-02-04 10:39

    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
    
    0 讨论(0)
  • 2021-02-04 10:42

    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  
    
    0 讨论(0)
提交回复
热议问题