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

问题描述 投票:75回答:9

有没有人成功为Go单元测试生成代码覆盖?我无法在网上找到适合的工具。

unit-testing testing go code-coverage
9个回答
96
投票

请注意,Go 1.2 (Q4 2013, rc1 is available)现在将显示test coverage results

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

cover工具是go.tools subrepository的一部分。它可以通过运行安装

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

封面工具做两件事。

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

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

Frank Shearar mentions

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

go test -coverprofile <filename> <package name>

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

$ go help testflag
$ go tool cover -help

Ivan Black提到in the comments

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

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

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

我只需输入gc,并列出所有尚未覆盖的行(此处:coverage.out行不以“1”结尾)。


30
投票

Go带有很棒的测试和覆盖工具。尽管所有Go工具都有详细记载go tool cover -help我建议阅读The cover story article on the official Go blog。它有很多例子,我强烈推荐它!

我在〜/ .bash_profile中有这个功能。 (你可以把它粘贴在终端上试一试)。

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

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

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

cover fmt

此命令中终端的输出将是:

ok      fmt 0.031s  coverage: 91.9% of statements

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

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


5
投票

这是正确的here,一些文档here

$ 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
$

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


4
投票

除了上面的好答案,我发现这三行是最简单的获取方式(包括所有包):

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

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


3
投票

如果你想直接在终端中看到未覆盖的线路,我为此目的重写了封面工具。它可以在https://github.com/gregoryv/uncover上找到。

用法

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

截图

enter image description here


2
投票

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

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

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 Coverage Tool for go lang

Go Test Report Tool

替代方法

去原生测试报道

go test -coverprofile=coverage.out
go tool cover -html=coverage.out

1
投票

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

$ go test -coverprofile cp.out //明智地在一个班轮中发布覆盖率

执行上述命令后,如果您希望直观地看到代码覆盖率(如覆盖的语句和错过的等)

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

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


1
投票

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

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

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

test coverage script在所有项目的文件夹上运行并生成,每个文件夹的.cover文件夹junit和覆盖率报告,以及所有项目测试的联合覆盖率报告。

Codecov还建议收集覆盖率结果的脚本:multiple files

© www.soinside.com 2019 - 2024. All rights reserved.