golang代码覆盖率测试工具插件库goc的使用
Golang代码覆盖率测试工具插件库goc的使用
goc是一个针对Go编程语言的全面覆盖率测试系统,特别适用于一些复杂场景,如系统测试代码覆盖率收集和精确测试。
安装
根据不同操作系统安装goc:
# Mac/AMD64
curl -s https://api.github.com/repos/qiniu/goc/releases/latest | grep "browser_download_url.*-darwin-amd64.tar.gz" | cut -d : -f 2,3 | tr -d \" | xargs -n 1 curl -L | tar -zx && chmod +x goc && mv goc /usr/local/bin
# Linux/AMD64
curl -s https://api.github.com/repos/qiniu/goc/releases/latest | grep "browser_download_url.*-linux-amd64.tar.gz" | cut -d : -f 2,3 | tr -d \" | xargs -n 1 curl -L | tar -zx && chmod +x goc && mv goc /usr/local/bin
# Linux/386
curl -s https://api.github.com/repos/qiniu/goc/releases/latest | grep "browser_download_url.*-linux-386.tar.gz" | cut -d : -f 2,3 | tr -d \" | xargs -n 1 curl -L | tar -zx && chmod +x goc && mv goc /usr/local/bin
示例
为Golang系统测试收集代码覆盖率
goc可以为长时间运行的Golang应用程序收集运行时代码覆盖率。通常只需要三个步骤:
- 使用
goc server
启动服务注册中心:
goc server
- 使用
goc build
构建目标服务,并运行生成的二进制文件(以simple-go-server项目为例):
goc build .
./simple-go-server
- 使用
goc profile
获取已启动服务的代码覆盖率配置文件:
goc profile
输出示例:
mode: atomic
enricofoltran/simple-go-server/main.go:30.13,48.33 13 1
enricofoltran/simple-go-server/main.go:48.33,50.3 1 0
enricofoltran/simple-go-server/main.go:52.2,65.12 5 1
enricofoltran/simple-go-server/main.go:65.12,74.46 7 1
enricofoltran/simple-go-server/main.go:74.46,76.4 1 0
...
其中每行格式说明:
enricofoltran/simple-go-server/main.go:30.13,48.33 13 1
文件: enricofoltran/simple-go-server/main.go
代码块第一个点的位置: 30.13
代码块第二个点的位置: 48.33
代码块的语句数量: 13
代码块的执行次数: 1
在Vscode中显示运行时代码覆盖率变化
我们提供了一个vscode扩展 - Goc Coverage,可以在运行时显示高亮覆盖的源代码。
提示
-
要了解goc工具的执行细节,可以使用
--debug
标志。如果您向我们提交错误报告,我们也希望您能提供此类日志。 -
默认情况下,被覆盖的服务将监听一个随机端口以便与goc服务器通信。这在docker或kubernetes环境中可能不合适,因为在这种环境中必须显式公开端口才能被其他服务访问。对于这种场景,您可以在调用
goc build
或goc install
时使用--agentport
标志指定固定端口。 -
要使用远程goc服务器,您可以使用
--center
标志与goc build
或goc install
命令一起编译目标服务。 -
覆盖率数据存储在每个被覆盖的服务端,因此如果某个服务在测试期间需要重启,则该服务的覆盖率数据将丢失。对于这种情况,您可以按照以下步骤处理:
- 在服务重启前,使用
goc profile -o a.cov
收集覆盖率 - 服务重启并测试完成后,再次使用
goc profile -o b.cov
收集覆盖率 - 合并两个覆盖率配置文件:
goc merge a.cov b.cov -o merge.cov
- 在服务重启前,使用
-
默认情况下,goc将使用工件的文件名作为其服务名。您可以通过设置环境变量
GOC_SERVICE_NAME
来覆盖它。
路线图
- [x] 支持系统测试的代码覆盖率收集
- [x] 支持运行时清除被测服务的代码覆盖率计数器
- [x] 支持面向精确测试的开发模式
- [x] 支持基于Pull Request的代码覆盖率差异
- [ ] 优化代码覆盖率计数器带来的性能开销
贡献
我们欢迎各种形式的贡献,包括错误报告、功能请求、文档改进、UI优化等。
许可证
goc在Apache 2.0许可证下发布。
更多关于golang代码覆盖率测试工具插件库goc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang代码覆盖率测试工具插件库goc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
goc - Go语言代码覆盖率测试工具
goc 是一个开源的 Go 语言代码覆盖率收集工具,它能够在不修改源代码的情况下收集覆盖率数据,特别适合集成测试和黑盒测试场景。
goc 的主要特点
- 无需代码修改:不需要在代码中添加特殊指令或修改构建方式
- 实时收集:可以实时收集覆盖率数据,而不需要等待程序结束
- 支持分布式:适合微服务架构的覆盖率收集
- Web界面:提供可视化界面查看覆盖率报告
安装 goc
go install github.com/qiniu/goc@latest
基本使用方法
1. 使用 goc 运行测试
goc test ./... -coverprofile=coverage.out
2. 作为服务运行并收集覆盖率
# 启动 goc 服务
goc server
# 在另一个终端中运行你的程序
goc run main.go
# 收集覆盖率数据
goc profile -o coverage.out
实际项目示例
假设我们有一个简单的 Go 项目结构如下:
myproject/
├── main.go
├── utils/
│ └── math.go
└── utils_test.go
示例代码
utils/math.go
:
package utils
func Add(a, b int) int {
return a + b
}
func Subtract(a, b int) int {
return a - b
}
utils_test.go
:
package utils
import "testing"
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Expected 5, got %d", result)
}
}
使用 goc 收集覆盖率
- 首先启动 goc 服务:
goc server
- 在另一个终端中运行测试:
goc test -v ./...
- 生成覆盖率报告:
goc profile -o coverage.out
- 查看 HTML 报告:
go tool cover -html=coverage.out
高级功能
持久化覆盖率数据
goc profile --center=http://127.0.0.1:7777 --service=my-service -o coverage.out
集成到 CI/CD
在 CI 环境中,你可以这样使用:
# 启动服务
goc server &
# 运行测试
goc test ./... -coverprofile=coverage.out
# 生成报告
goc profile -o coverage.out
# 转换为 lcov 格式
goc convert --type=lcov --output=coverage.lcov coverage.out
与原生 go test 的比较
特性 | goc | go test |
---|---|---|
实时收集 | 支持 | 不支持 |
分布式服务 | 支持 | 不支持 |
无需修改代码 | 支持 | 需要-cover参数 |
集成测试 | 非常适合 | 有限支持 |
性能影响 | 较低 | 较低 |
注意事项
- goc 会启动一个 HTTP 服务(默认端口 7777),确保该端口可用
- 在生产环境使用时要注意性能影响
- 对于短期运行的测试,原生 go test 可能更简单
- 对于微服务架构,goc 的优势更明显
goc 是 Go 语言覆盖率测试的一个强大工具,特别适合复杂项目和微服务架构的测试需求。通过其分布式特性和实时收集能力,可以大大简化覆盖率测试的复杂度。