12

我想使用 Coveralls 跟踪 go 项目的测试覆盖率,使用 https://github.com/mattn/goveralls的集成参考说明

cd $GOPATH/src/github.com/yourusername/yourpackage
$ goveralls your_repos_coveralls_token

但是,这只会发布一个包的结果,并且依次运行包不起作用,因为最终运行会覆盖所有其他运行。有没有人想出如何获得多个包裹的覆盖范围?

4

6 回答 6

10

我最终使用了这个脚本

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

它基本上找到路径中的所有目录并分别为它们打印覆盖率配置文件。然后,它将文件连接成一个大配置文件,并将它们发送到工作服中。

于 2014-01-15T16:02:51.593 回答
5

接受 Usman 的回答,并对其进行更改以支持跳过 Godep 和其他不相关的文件夹:

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

请注意,我不是查看每个目录,而是go list ./...使用列出实际用于构建 go 包的所有目录的命令。

希望对其他人有所帮助。

** 编辑 **

如果您使用vendorGo v.1.6+ 的文件夹,则此脚本会过滤掉依赖项:

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  
于 2015-10-31T06:15:19.037 回答
4

有没有人想出如何获得多个包裹的覆盖范围?

注意:使用 Go 1.10(2018 年第一季度),这实际上是可能的。
CL 76875

cmd/go: 允许-coverprofile测试多个包

可以在commit 283558e中看到多包代码覆盖测试的实现


自Go 1.10(2018 年 2 月)发布以来,Jeff Martin在评论中确认:

  • go test -v -cover ./pkgA/... ./pkgB/... -coverprofile=cover.out获得良好的个人资料并且
  • go tool cover -func "cover.out"会得到一个total: (statements) 52.5%.

所以它正在工作!

于 2017-11-10T23:13:38.390 回答
2

我一直在使用http://github.com/axw/gocov来获取我的代码覆盖率。

我在一个 bash 脚本中触发它,在这里我调用我所有的包。

我还使用http://github.com/matm/gocov-html格式化为 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
     ;;

希望能有所帮助。

于 2014-01-15T15:04:44.853 回答
1

这是一个纯 GO 解决方案:

我创建了一个可能有帮助的库,https://github.com/bluesuncorp/overalls

它所做的只是递归地遍历每个目录(也就是每个包),运行 go test 并生成coverprofiles,然后将所有配置文件合并到项目目录根目录下的一个名为overalls.coverprofile

然后您可以使用https://github.com/mattn/goveralls之类的工具将其发送到 coveralls.io

希望大家喜欢

于 2015-08-04T03:16:20.263 回答
1

在 Go 1.13 中,以下命令生成多个包的覆盖率

go test -v -coverpkg=./... -coverprofile=profile.cov ./...
go tool cover -func profile.cov

用于 html 报告

go tool cover -html=profile.cov -o cover.html
于 2020-04-07T17:33:38.470 回答