157

有没有人成功地为 Go 单元测试生成代码覆盖率?我在网上找不到这样的工具。

4

13 回答 13

179

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

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

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

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

封面工具做了两件事。

  • 首先,当“ go test”被赋予-cover标志时,它会自动运行以重写包的源代码并插入检测语句。然后像往常一样编译和运行测试,并报告基本的覆盖率统计信息:

    $ go test -coverprofile fmtcoverage.html fmt ok fmt 0.060s 覆盖率:91.4% 的语句 $

  • 其次,对于更详细的报告,“go test”的不同标志可以创建一个覆盖率配置文件,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”结尾)。


2022 年更新,可能适用于 Go 1.19

提议:扩展 Go 的代码覆盖测试以包括应用程序

虽然go test将继续支持现有的基于 " " 的覆盖工作流,但建议将覆盖添加为 " go build" 的新构建模式。

就像用户可以使用“”构建一个带有竞争检测器的可执行文件一样go build -race,也可以使用“”构建一个带有覆盖率的可执行文件go build -cover

将支持合并在不同 GOOS/GOARCH 环境中生成的覆盖配置文件。

于 2013-09-20T07:54:44.000 回答
51

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 项目/包文件夹并输入cover. 这将在浏览器中打开一个可视化工具,向您显示当前包中每个文件的已测试和未测试代码。非常有用的命令!我强烈推荐它来查找尚未 100% 测试的内容!显示的结果是每个文件。从左上角的下拉菜单中,您可以查看所有文件的结果。

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

cover fmt

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

ok      fmt 0.031s  coverage: 91.9% of statements

除了在您的浏览器中,您还会看到此工具以红色显示所有未包含在测试中的代码行:

在此处输入图像描述

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

于 2014-12-04T01:00:52.953 回答
42

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

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

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

于 2018-08-01T13:32:07.903 回答
16

只需运行

go test -cover

或者

go test -coverprofile=coverage.out ; 
go tool cover -func=coverage.out
于 2020-12-26T07:17:26.933 回答
9

覆盖报告:

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

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

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

于 2019-09-26T17:19:51.517 回答
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
$

我没用过,我只知道这些。

于 2012-05-09T13:22:45.157 回答
5

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

用法

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

截屏

在此处输入图像描述

于 2018-08-20T19:16:49.230 回答
4

如果您使用的是VSCode ,则此功能是开箱即用的(但默认禁用

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

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

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

于 2019-10-31T16:16:32.280 回答
1

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

f=cover.out; if [ -f $f ]; then rm $f; fi; go test ./... -coverprofile $f && \
go tool cover -html $f && \
rm $f
于 2015-11-22T15:51:35.533 回答
1

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

$ go test -coverprofile cp.out // 以一个线性百分比的方式发射覆盖率

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

$ go tool cover -html=cp.out

注意:您需要在您希望查看覆盖范围的文件夹中执行上述命令

于 2018-05-08T17:48:43.170 回答
0

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

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

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

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

Codecov 还建议了一个收集覆盖结果的脚本:多个文件

于 2017-01-03T08:49:56.400 回答
0

如果要在 中查找测试覆盖率Windows,只需转到所需的文件夹command prompt并键入以下命令:

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

这非常简单并且工作可靠。

于 2021-05-11T14:10:24.530 回答
-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

参考

用于 Go 语言的 GoTest 覆盖工具

Go 测试报告工具

替代方法

Go Native 测试覆盖率

go test -coverprofile=coverage.out
go tool cover -html=coverage.out
于 2018-03-01T06:39:21.173 回答