[英]How to measure test coverage in Go
有没有人成功生成 Go 单元测试的代码覆盖率? 我在 web 上找不到相关工具。
请注意, Go 1.2(2013 年第四季度,rc1 可用)现在将显示测试覆盖率结果:
go test
一个主要新特性是它现在可以计算,并在一个新的、单独安装的“go tool cover
”程序的帮助下,显示测试覆盖率结果。
cover
工具是go.tools
存储go.tools
一部分。 它可以通过运行安装
$ 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 test”的不同标志可以创建一个覆盖配置文件,然后由“
go tool cover
”调用的封面程序可以分析该文件。
最新版本的 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
在默认浏览器中打开cover.out
我什至不想等待浏览器打开,所以我定义了这个别名:
alias gc=grep -v -e " 1$" cover.out
我只需键入gc
,并拥有所有尚未覆盖的行的列表(此处用coverage.out
线不能与“结尾1
”)。
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 覆盖文件而不是在浏览器中打开它。 当您的测试 + 覆盖率由像 Jenkins 这样的 CI 工具运行时,这非常有用。 这样你就可以从中央服务器提供覆盖文件,整个团队将能够看到每个构建的覆盖结果。
除了上面的好答案之外,我发现这三行是获取它的最简单方法(包括所有包):
go test -v -coverprofile cover.out ./YOUR_CODE_FOLDER/...
go tool cover -html=cover.out -o cover.html
open cover.html
请注意,在 HTML 文件中,您会找到一个下拉按钮,可将您定向到所有文件。
覆盖率报告 →
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
文件,分析详细的coverage信息。
我在 web 上找不到相应的工具。
实际上......现在(2022 年)web 上有这样一个工具,来自Nikolay Dubina的项目go-cover-treemap-web
:
它没有上传任何内容(处理仍然是本地的),但是通过拖放您的封面配置文件,Web UI(使用 Go WASM)将运行go-cover-treemap
并显示:
(https 的覆盖率://github.com/gohugoio/hugo )
$ 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 test -cover
要么
go test -coverprofile=coverage.out ;
go tool cover -func=coverage.out
如果您想直接在终端中按功能查看未覆盖的行,我为此目的重写了封面工具。 它可以在https://github.com/gregoryv/uncover 上找到。
用法
go get -u github.com/gregoryv/uncover/...
go test -coverprofile /tmp/c.out
uncover /tmp/c.out
截屏
如果您使用的是VSCode,则此功能支持开箱即用(但默认情况下禁用)
只需打开保存 + 覆盖率报告的测试
https://github.com/microsoft/vscode-go/wiki/On-Save-features
它甚至会在您的编辑器中显示哪些行没有被覆盖,这非常方便。
受帮助菜单和此问题的其他答案的启发,只需运行:
f=cover.out; if [ -f $f ]; then rm $f; fi; go test ./... -coverprofile $f && \
go tool cover -html $f && \
rm $f
一种快速简便的方法是使用内置 go 附带的覆盖工具:
$ go test -coverprofile cp.out // 以一个线性百分比方式发出覆盖率
执行上述命令后,如果您想直观地看到代码覆盖率(如覆盖语句和遗漏等)
$ go 工具封面 -html=cp.out
注意:您需要在您希望查看覆盖率的文件夹中执行上述命令
尝试使用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
测试覆盖脚本在所有项目的文件夹上运行,并在.cover文件夹中生成每个文件夹的 junit 和覆盖报告,以及所有项目测试的组合覆盖报告。
Codecov 还建议了一个收集覆盖结果的脚本:多个文件
如果您想在Windows
找到测试覆盖率,只需在command prompt
转到所需的文件夹并键入以下命令:
go test -coverprofile=coverage.out && go tool cover -html=coverage.out
这非常简单并且工作可靠。
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 Native 测试覆盖率
go test -coverprofile=coverage.out
go tool cover -html=coverage.out
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.