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

Geo*_*sev 96 testing unit-testing code-coverage go

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

Von*_*onC 112

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

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

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

$ go get golang.org/x/tools/cmd/cover
Run Code Online (Sandbox Code Playgroud)

封面工具做两件事.

  • 首先,当go test给"" " -cover标志时,它会自动运行以重写包的源并插入检测语句.然后编译测试并照常运行,并报告基本的覆盖率统计数据:
$ go test -coverprofile fmtcoverage.html fmt
ok      fmt 0.060s  coverage: 91.4% of statements
$
Run Code Online (Sandbox Code Playgroud)

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

Frank Shearar 提到:

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

go test -coverprofile <filename> <package name>
Run Code Online (Sandbox Code Playgroud)

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

$ go help testflag
$ go tool cover -help
Run Code Online (Sandbox Code Playgroud)

Ivan Black 在评论中提到:

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

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

alias gc=grep -v -e " 1$" coverage.out
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,最新版本的 Go (2013/09/19) 使用 `go test -coverprofile &lt;filename&gt; &lt;package name&gt;` (2认同)
  • `go test -coverprofile cover.out` 然后 `go tool cover -html=cover.out -o cover.html` 在浏览器中打开 `cover.html` (2认同)

Pav*_*lov 34

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

cover fmt

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

ok      fmt 0.031s  coverage: 91.9% of statements
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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


Rez*_*aba 17

已经内置在 VSCode 中

  1. Ctrl+Shift+P打开命令面板
  2. Go:切换测试覆盖率...

绿色部分已测试,红色部分测试

在此输入图像描述


Von*_*onC 16

我在网上找不到这样的工具。

实际上......现在(2022)网络上有这样一个工具,来自Nikolay Dubina的项目go-cover-treemap-web

https://go-cover-treemap.io/

它没有上传任何内容(处理仍然在本地),但是通过拖放您的封面配置文件,Web UI(使用 Go WASM)将运行go-cover-treemap并显示:

https://github.com/nikolaydubina/go-cover-treemap/raw/main/docs/hugo.svg
(gocovergage https://github.com/gohugoio/hugo


小智 9

覆盖率报告 ?

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在浏览器中打开特此生成的文件,分析详细的覆盖信息。


Sha*_*atz 6

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

go test -v -coverprofile cover.out ./YOUR_CODE_FOLDER/...
go tool cover -html=cover.out -o cover.html
open cover.html
Run Code Online (Sandbox Code Playgroud)

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


Ami*_*aei 6

只需运行

go test -cover
Run Code Online (Sandbox Code Playgroud)

或者

go test -coverprofile=coverage.out ; 
go tool cover -func=coverage.out
Run Code Online (Sandbox Code Playgroud)


zzz*_*zzz 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
$
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

用法

go get -u github.com/gregoryv/uncover/...
go test -coverprofile /tmp/c.out
uncover /tmp/c.out
Run Code Online (Sandbox Code Playgroud)

截屏

在此输入图像描述


小智 5

如果您使用VSCode,则开箱即用地支持此功能(但默认情况下禁用

只需打开保存测试 + 覆盖率报告

https://github.com/microsoft/vscode-go/wiki/On-Save-features

它甚至会在您的编辑器中显示哪些行未被覆盖,这非常方便。