是否可以将多个包的承保范围发布到Coveralls?

时间:2014-01-14 23:10:24

标签: go coveralls

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

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

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

6 个答案:

答案 0 :(得分:10)

我最终使用了这个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

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

答案 1 :(得分: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包的所有目录。

希望能帮助他人。

**编辑**

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

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  

答案 2 :(得分: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
     ;;

希望有所帮助。

答案 3 :(得分:2)

  

有没有人想出如何获得多个套餐的保险?

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

  

cmd/go:允许-coverprofile正在测试多个软件包

您可以在commit 283558e

中看到多包代码覆盖率测试的实现

Jeff Martinrelease of Go 1.10(2018年2月)确认后in the comments

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

所以它正在发挥作用!

答案 4 :(得分:1)

这是一个纯粹的GO解决方案:

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

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

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

希望每个人都喜欢

答案 5 :(得分:1)

在Go 1.13中,以下命令可生成多个程序包的覆盖范围

go tool cover -html=profile.cov -o cover.html

用于html报告

mkdir -p cat1/cat2/cat3