如何衡量Golang中的代码覆盖率?


Answers:


138

请注意,Go 1.2(2013年第四季度,可用rc1)现在将显示测试覆盖率结果

的一项主要新功能go test是,它现在可以计算并在单独安装的新程序的帮助下go tool cover显示测试覆盖率结果

cover工具是一部分go.toolssubrepository。可以通过运行安装

$ go get golang.org/x/tools/cmd/cover

封面工具有两件事。

  • 首先,go test给“ ” -cover标志时,它将自动运行以重写包的源并插入检测语句。然后将测试编译并照常运行,并报告基本覆盖率统计信息:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$

其次,对于更详细的报告,要“进行测试”的不同标志可以创建一个覆盖率配置文件,go tool cover然后用“ ” 调用的覆盖程序可以对其进行分析。

弗兰克·希勒 Frank Shearar)提到

Go(2013/09/19)的最新版本使用:

go test -coverprofile <filename> <package name>

运行命令可以找到有关如何生成和分析覆盖率统计信息的详细信息

$ go help testflag
$ go tool cover -help

伊万·布莱克Ivan Black在评论中提到:

go test -coverprofile cover.out然后在您的默认浏览器中
go tool cover -html=cover.out打开cover.out

我什至不想等待浏览器打开,所以我定义了这个别名:

alias gc=grep -v -e " 1$" cover.out

我只需要输入gc,并拥有所有行的列表不是尚未覆盖的(这里用coverage.out以“结束1“)。


2
请注意,最新版本的Go(2013/09/19)使用go test -coverprofile <filename> <package name>
Frank Shearar 2013年

@FrankShearar好的。我已将您的评论包含在答案中,以提高知名度。
VonC

go test -coverprofile cover.out然后在浏览器中go tool cover -html=cover.out -o cover.html打开cover.html
Ivan Black

@IvanBlack好点。我将其包含在答案中以提高可见性。我还添加了一个别名,用于快速查看未覆盖的行。
VonC

1
@VonC go tool cover -html=cover.out将自动打开浏览器,但不适用于我的系统。我更喜欢保持浏览器打开并在必要时刷新页面。
伊万·布莱克

41

Go随附了很棒的工具来进行测试和覆盖。尽管所有Go工具都有很好的文档记录,但go tool cover -help我建议阅读官方Go博客上的封面文章。它有很多例子,我强烈推荐它!

我的〜/ .bash_profile中有此功能。(您可以将其粘贴到终端中进行尝试)。

cover () { 
    t="/tmp/go-cover.$$.tmp"
    go test -coverprofile=$t $@ && go tool cover -html=$t && unlink $t
}

然后cd进入go project / package文件夹并输入cover。这将在浏览器中打开一个可视工具,向您显示当前包中每个文件的经过测试和未经测试的代码。非常有用的命令!我强烈建议您查找尚未经过100%测试的内容!显示的结果是每个文件的。从左上角的下拉列表中,您可以查看所有文件的结果。

使用此命令,您还可以检查任何包装的覆盖范围,例如:

cover fmt

该命令在终端中的输出为:

ok      fmt 0.031s  coverage: 91.9% of statements

除了浏览器之外,您还将看到此工具以红色显示测试未涵盖的所有代码行:

在此处输入图片说明

也可以只保存html coverage文件,而不用在浏览器中打开它。如果您的测试+覆盖范围是由诸如詹金斯(Jenkins)这样的CI工具运行的,这将非常有用。这样,您可以从中央服务器提供Coverage文件,整个团队将能够看到每个构建的Coverage结果。



有趣的是,我将对其进行测试。+1
VonC 2014年

这太棒了!感谢分享。最终进入测试脚本,因为我想测试程序中的主程序包。欢呼声
詹姆斯·奥图尔

11

除了上面的好答案之外,我发现以下三行是获得它的最简单方法(包括所有软件包):

go test -v -coverprofile cover.out ./YOUR_CODE_FOLDER/...
go tool cover -html=cover.out -o cover.html
open cover.html

请注意,在HTML文件中,您会找到一个下拉按钮,可将您定向到所有文件。


5

在这里,一些文档在这里

$ go tool
6a
6c
6g
6l
addr2line
api
cgo
cov
dist
ebnflint
fix
gotype
nm
objdump
pack
pprof
prof
vet
yacc
$ go tool cov -h
usage: cov [-lsv] [-g substring] [-m minlines] [6.out args...]
-g specifies pattern of interesting functions or files
go tool cov: exit status 1
$

我没有用过,这就是我所知道的。


您需要手动安装吗?在我的本地go安装(go版本go1)中,它不存在。
oers

我相信它是由./all.bash构建的。我无法验证ATM,我还没有发布CL,因为我有一个待处理的CL,但是我看到的cov二进制时间戳~/go/pkg/tool/linux_amd64与昨天的上次Go版本匹配。
zzzz 2012年

是的,运行./all.bash即可。感谢您的帮助,jnml!
乔治·阿塞夫

我在x86机器上运行它时遇到一些问题。我尝试更改此线程中提到的main.c:groups.google.com/group/golang-dev/browse_thread/thread/…但它在另一个位置生成运行时错误。我将在64位计算机上尝试。
乔治·阿塞夫

3

如果您想直接在终端中按功能查看未发现的行,我为此重写了覆盖工具。可在https://github.com/gregoryv/uncover上获得

用法

go get -u github.com/gregoryv/uncover/...
go test -coverprofile /tmp/c.out
uncover /tmp/c.out

屏幕截图

在此处输入图片说明



2

覆盖率报告→

a)运行所有测试并启用覆盖率-> go test ./... -coverprofile coverage.out

b)获得单个功能的覆盖范围以及整体覆盖范围→ go tool cover -func coverage.out

c)查看测试中涵盖的行和未涵盖的行→ go tool cover -html=cover.out -o coverage.html。打开coverage.html在浏览器中生成的文件,并分析详细的覆盖率信息。


1

一种快速简便的方法是使用内置go附带的coverage工具:

$ go test -coverprofile cp.out //以一个班轮百分比明智地覆盖

执行上述命令后,如果希望直观地查看代码覆盖范围(如覆盖的语句和遗漏等)

$ go工具封面-html = cp.out

注意:您需要在想要查看覆盖率的文件夹中执行上述命令


1

受此问题的帮助菜单和其他答案的启发,只需运行:

f=cover.out; if [ -f $f ]; then rm $f; fi; go test ./... -coverprofile $f && \
go tool cover -html $f && \
rm $f

0

尝试使用gaia-docker / base-go-build Docker Image。

这是一个Docker映像,其中包含构建和测试覆盖率所需的全部内容。在Docker容器中运行测试覆盖率会创建一个.cover文件夹,其中包含项目的测试覆盖率结果。

docker run --rm -v "$PWD":$PROJECT_PATH -w $PROJECT_PATH $BUILDER_IMAGE_NAME /go/script/coverage.sh

测试覆盖脚本在所有项目上运行的文件夹,并生成,内部设备罩起来文件夹,每个文件夹JUnit和覆盖报告,以及将所有项目的覆盖报告的测试。

Codecov还建议使用一个脚本来收集覆盖率结果:多个文件


-1

Golang的测试范围

go get github.com/axw/gocov/gocov go get -u gopkg.in/matm/v1/gocov-html

检查它是否正确安装,并且您可以从终端访问

运行测试用例

如果运行测试用例,它将基于该文件重做.json文件,您将获得.html文件中的代码覆盖率报告

gocov test >your_Coverage_report.json

测试用例完成后,使用.json在.html文件中生成报告

gocov-html your_Coverage_report.json >your_Coverage_report.html

参考

GoTest覆盖语言工具

去测试报告工具

替代方法

进行原生测试

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.