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应用程序收集运行时代码覆盖率。通常只需要三个步骤:

  1. 使用goc server启动服务注册中心:
goc server
  1. 使用goc build构建目标服务,并运行生成的二进制文件(以simple-go-server项目为例):
goc build .
./simple-go-server
  1. 使用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,可以在运行时显示高亮覆盖的源代码。

提示

  1. 要了解goc工具的执行细节,可以使用--debug标志。如果您向我们提交错误报告,我们也希望您能提供此类日志。

  2. 默认情况下,被覆盖的服务将监听一个随机端口以便与goc服务器通信。这在docker或kubernetes环境中可能不合适,因为在这种环境中必须显式公开端口才能被其他服务访问。对于这种场景,您可以在调用goc buildgoc install时使用--agentport标志指定固定端口。

  3. 要使用远程goc服务器,您可以使用--center标志与goc buildgoc install命令一起编译目标服务。

  4. 覆盖率数据存储在每个被覆盖的服务端,因此如果某个服务在测试期间需要重启,则该服务的覆盖率数据将丢失。对于这种情况,您可以按照以下步骤处理:

    • 在服务重启前,使用goc profile -o a.cov收集覆盖率
    • 服务重启并测试完成后,再次使用goc profile -o b.cov收集覆盖率
    • 合并两个覆盖率配置文件:goc merge a.cov b.cov -o merge.cov
  5. 默认情况下,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

1 回复

更多关于golang代码覆盖率测试工具插件库goc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


goc - Go语言代码覆盖率测试工具

goc 是一个开源的 Go 语言代码覆盖率收集工具,它能够在不修改源代码的情况下收集覆盖率数据,特别适合集成测试和黑盒测试场景。

goc 的主要特点

  1. 无需代码修改:不需要在代码中添加特殊指令或修改构建方式
  2. 实时收集:可以实时收集覆盖率数据,而不需要等待程序结束
  3. 支持分布式:适合微服务架构的覆盖率收集
  4. 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 收集覆盖率

  1. 首先启动 goc 服务:
goc server
  1. 在另一个终端中运行测试:
goc test -v ./...
  1. 生成覆盖率报告:
goc profile -o coverage.out
  1. 查看 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参数
集成测试 非常适合 有限支持
性能影响 较低 较低

注意事项

  1. goc 会启动一个 HTTP 服务(默认端口 7777),确保该端口可用
  2. 在生产环境使用时要注意性能影响
  3. 对于短期运行的测试,原生 go test 可能更简单
  4. 对于微服务架构,goc 的优势更明显

goc 是 Go 语言覆盖率测试的一个强大工具,特别适合复杂项目和微服务架构的测试需求。通过其分布式特性和实时收集能力,可以大大简化覆盖率测试的复杂度。

回到顶部