我想使用 Coveralls 跟踪 go 项目的测试覆盖率,使用 https://github.com/mattn/goveralls的集成参考说明
cd $GOPATH/src/github.com/yourusername/yourpackage
$ goveralls your_repos_coveralls_token
但是,这只会发布一个包的结果,并且依次运行包不起作用,因为最终运行会覆盖所有其他运行。有没有人想出如何获得多个包裹的覆盖范围?
我想使用 Coveralls 跟踪 go 项目的测试覆盖率,使用 https://github.com/mattn/goveralls的集成参考说明
cd $GOPATH/src/github.com/yourusername/yourpackage
$ goveralls your_repos_coveralls_token
但是,这只会发布一个包的结果,并且依次运行包不起作用,因为最终运行会覆盖所有其他运行。有没有人想出如何获得多个包裹的覆盖范围?
我最终使用了这个脚本:
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
它基本上找到路径中的所有目录并分别为它们打印覆盖率配置文件。然后,它将文件连接成一个大配置文件,并将它们发送到工作服中。
接受 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 包的所有目录的命令。
希望对其他人有所帮助。
** 编辑 **
如果您使用vendor
Go 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
有没有人想出如何获得多个包裹的覆盖范围?
注意:使用 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%
.所以它正在工作!
我一直在使用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
;;
希望能有所帮助。
这是一个纯 GO 解决方案:
我创建了一个可能有帮助的库,https://github.com/bluesuncorp/overalls
它所做的只是递归地遍历每个目录(也就是每个包),运行 go test 并生成coverprofiles,然后将所有配置文件合并到项目目录根目录下的一个名为overalls.coverprofile
然后您可以使用https://github.com/mattn/goveralls之类的工具将其发送到 coveralls.io
希望大家喜欢
在 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