如何在Go中一起获取所有包的代码覆盖率?

50

我有一个由几个软件包组成的库。运行测试时,我使用'-cover'标志,它会分别显示每个软件包的覆盖率信息。就像下面这样:

--- PASS: TestSampleTestSuite (0.00s)
PASS
coverage: 28.7% of statements
ok      github.com/path/to/package1 13.021s
?       github.com/path/to/package2 [no test files]

=== RUN   TestAbc
--- PASS: TestAbc (0.43s)
PASS
coverage: 27.7% of statements

有没有简单快捷的方法可以获取整个项目的完整覆盖率概述,以便更好地了解整个项目的覆盖范围?

更新:这是我正在使用的go test命令

go test ./... -v -short -p 1 -cover
1个回答

56

编辑:自从我写这个答案以来,事情发生了改变。请参阅Go 1.10的发布说明:https://golang.org/doc/go1.10#test

现在,go test -coverpkg 标志将其参数解释为逗号分隔的模式列表,用于匹配每个测试的依赖项,而不是要重新加载的包列表。例如,现在 go test -coverpkg=all 是使用覆盖率运行测试包及其所有依赖项的有意义的方式。此外,在运行多个测试时,现在支持 go test -coverprofile 选项。

现在你可以运行

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

旧回答

这是从 https://github.com/h12w/gosweep 提取的一个bash脚本:

#!/bin/bash
set -e

echo 'mode: count' > profile.cov

for dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -type d);
do
if ls $dir/*.go &> /dev/null; then
    go test -short -covermode=count -coverprofile=$dir/profile.tmp $dir
    if [ -f $dir/profile.tmp ]
    then
        cat $dir/profile.tmp | tail -n +2 >> profile.cov
        rm $dir/profile.tmp
    fi
fi
done

go tool cover -func profile.cov

它输出的最后一行是:total: (statements) 99.3%,这不是你想要的吗,@Rana? - HectorJ
1
我也遇到了“坏模式行”的问题。我不得不在开始时添加这一行代码:echo "mode: count" > profile.cov - nboon
2
我想问一下,这个只会为那些有测试的文件生成覆盖率报告吧?另外,我还需要添加-not -path './vendor/*'来忽略供应商包。 - danielcooperxyz
2
@danielcooperxyz 是正确的。没有测试的包将生成一个只含“mode:count”的单行分析文件。尾命令将删除此行并在profile.cov中不追加任何内容。这将防止go tool cover -func profile.cov 准确计算总覆盖率。就其价值而言,go test -coverprofile=profile.cov ./... 在功能上等同于此脚本的大部分,也受到相同的不准确性影响。 - Alex Jansen
1
@rubystallion 添加了一个如何使用它们的示例。 - HectorJ
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接