Golang代码覆盖率检测的实现方法

Golang代码覆盖率检测的实现方法 我想知道是否可以从源代码构建带有覆盖率检测功能的Go,这样每次执行go rungo build时,我们都能检查Go编译器源代码的覆盖率。

func main() {
    fmt.Println("hello world")
}
6 回复

@christophberger 我指的是测量编译器本身的覆盖率

更多关于Golang代码覆盖率检测的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @PanickyPeguin

使用 Makefile 可以吗?

(编辑补充:我的意思是,与其重新编译 Go 工具链,你可以设置带有 -cover 标志的 make 目标来启用覆盖率检测构建代码。)

编辑 2:或者你是想测量编译器本身的覆盖率?

这听起来很像DevOps。看看这个:

图片

Golang代码覆盖率入门指南 - Codecov

Golang于2009年开发,是世界上最流行的编程语言之一。在Codecov,目前有超过14%的用户选择它作为首选语言…

预计阅读时间:4分钟

这会将关注覆盖率的责任转移到你的拉取请求等环节上。除此之外,假设你使用bash,也许你可以在你的 ~/.bashrc 文件中为命令设置别名?例如,我这样为我的npm命令设置了别名:

alias npm="winpty npm.cmd"

这样它就会使用winpty(我的设置比较复杂,在Windows上使用git bash,winpty让npm的颜色显示正常)。

通过一些调整,这或许是可行的。我在 golang-dev 邮件列表中发现了这封邮件

Keith Randall, 2016年6月7日, 2:07:56 AM, 发送给 golang-dev

Rob 和我让覆盖率工具在编译器本身上运行起来了(将 all.bash 在 amd64 上运行作为测试套件)。尽情享用吧!

有一个工具可以生成这些报告:GitHub - randall77/compilercover: 为 Go 编译器生成覆盖率报告的工具

在运行该工具之前,请务必阅读 main.go 文件顶部的说明。

你还需要这个补丁:https://go-review.googlesource.com/c/23831/

这封邮件来自 2016 年,所以效果可能因人而异。(或许值得深入挖掘 golang-dev 的存档。我只是粗略浏览了搜索“coverage compiler”得到的少数几个结果。)

是的,可以从源代码构建带有覆盖率检测的 Go 编译器,以便检查 Go 编译器源代码本身的代码覆盖率。

要实现这一点,你可以按照以下步骤操作:

  1. 克隆 Go 仓库:首先使用以下命令从 GitHub 克隆 Go 仓库:

    git clone https://github.com/golang/go.git
    
  2. 进入 Go 源代码目录:将你的工作目录切换到克隆的 Go 源代码目录:

    cd go
    
  3. 启用覆盖率检测:通过设置 GOFLAGS 环境变量来启用代码覆盖率检测。运行以下命令:

    export GOFLAGS="-cover"
    
  4. 构建 Go 编译器:使用 make 命令构建 Go 编译器。这将编译带有覆盖率检测的 Go 源代码:

    make
    

    这个过程可能需要一些时间,因为它会构建整个 Go 工具链。

  5. 检查覆盖率:构建过程完成后,你可以通过运行 go tool cover 命令并指定生成的覆盖率配置文件路径来检查 Go 编译器源代码的覆盖率。例如:

    go tool cover -html=coverage.out
    

    这将生成一个 HTML 报告,显示 Go 编译器源代码的覆盖率详情。

通过遵循这些步骤,你可以从源代码构建带有覆盖率检测的 Go 编译器,并使用生成的覆盖率配置文件分析 Go 编译器源代码的代码覆盖率。

在Go中实现代码覆盖率检测可以通过go test配合-cover标志来完成,但如果你想在常规构建(如go rungo build)中集成覆盖率检测,需要使用-cover标志进行编译,并配合环境变量收集覆盖率数据。以下是具体实现方法:

1. 使用-cover标志编译

通过go build -covergo run -cover编译带有覆盖率检测的二进制文件。但注意,标准go run命令不支持-cover,需要先编译再运行。

示例:

# 编译带覆盖率检测的可执行文件
go build -cover -o myapp .

# 运行并生成覆盖率数据
GOCOVERDIR=./covdata ./myapp

2. 设置覆盖率数据目录

通过GOCOVERDIR环境变量指定覆盖率数据输出目录。每次执行程序时,覆盖率数据会写入该目录。

示例代码(main.go):

package main

import "fmt"

func main() {
    fmt.Println("hello world")
    anotherFunction()
}

func anotherFunction() {
    fmt.Println("covered")
}

操作步骤:

# 创建覆盖率数据目录
mkdir covdata

# 编译并运行(多次执行以累积数据)
GOCOVERDIR=./covdata go run -cover main.go

# 查看覆盖率报告
go tool covdata percent -i=./covdata

3. 生成覆盖率报告

使用go tool covdata分析覆盖率数据目录,生成报告。

常用命令:

# 查看整体覆盖率百分比
go tool covdata percent -i=./covdata

# 生成文本格式的详细报告
go tool covdata textfmt -i=./covdata -o coverage.txt
go tool cover -func=coverage.txt

# 生成HTML报告
go tool cover -html=coverage.txt -o coverage.html

4. 完整示例流程

以下是一个从编译到生成HTML报告的完整示例:

# 1. 创建项目目录和文件
mkdir coverage-demo && cd coverage-demo
go mod init coverage-demo

# 2. 编写示例代码(main.go内容如上)

# 3. 创建覆盖率数据目录
mkdir covdata

# 4. 编译带覆盖率检测的程序
go build -cover -o myapp

# 5. 运行程序(多次执行)
GOCOVERDIR=./covdata ./myapp
GOCOVERDIR=./covdata ./myapp

# 6. 生成并查看报告
go tool covdata percent -i=./covdata
go tool covdata textfmt -i=./covdata -o coverage.txt
go tool cover -html=coverage.txt -o coverage.html

5. 注意事项

  • 覆盖率数据是累积的,多次运行会合并数据。
  • 使用-covermode可以设置覆盖模式(如atomiccount)。
  • 对于复杂项目,可以通过-coverpkg指定要检测的包。

示例(设置覆盖模式和包):

go build -cover -covermode=atomic -coverpkg=./... -o myapp .

通过以上方法,你可以在常规Go程序执行中实现覆盖率检测,而不仅限于测试场景。

回到顶部