golang使用go test输出单元测试覆盖率的方式

 更新时间:2024年02月28日 10:07:25   作者:xiaoliizi  
单元测试覆盖率是衡量代码质量的一个重要指标,重要的代码文件覆盖率应该至少达到80%以上,Java 可以通过JaCoCo 统计覆盖率,那么go 项目如何进行代码覆盖率测试呢,本文将给大家详细的介绍一下golang使用go test输出单元测试覆盖率的方式,需要的朋友可以参考下

一、背景

单元测试覆盖率是衡量代码质量的一个重要指标,重要的代码文件覆盖率应该至少达到80%以上。Java 可以通过JaCoCo 统计覆盖率,那么go 项目如何进行代码覆盖率测试呢?

二、统计方式

1、生成覆盖率报告(go test 指令)

我们知道直接执行测试代码的指令: go test 指定文件名称 -run “测试方法”。

项目工程是如下架构的,可以通过这种方式生成覆盖率报告:

在这里插入图片描述

go test -mod=vendor -covermode=count -coverprofile=coverprofile.cov -run="^Test" -coverpkg=$(go list -mod=vendor ./... | grep -v "/test" | tr '\n' ',') ./...

或 非 vendor 模式:
go test -covermode=count -coverprofile=coverprofile.cov -run="^Test" -coverpkg=$(go list ./... | grep -v "/test" | tr '\n' ',') ./...

生成结果:coverprofile.cov

指令简单说明:

mod=vendor: 加载依赖的方式:从本地vendor 目录加载。适用于服务器不能从外网下载依赖的情况

covermode: count: 统计代码访问次数;set: 统计代码是否被访问; atomic: 一般在并发工程中使用(?)

run: 正则方式指定需要运行的测试方法

coverpkg: 指定业务代码路径,多个用逗号隔开,详细说明在后面

./…:遍历当前目录下测试文件,包括子目录

关于为什么要使用coverpkg:

主要是因为我们的项目结构中,测试代码和业务代码是分开的,而不是放到同一个目录中。因此如果只指定测试方法,就无法识别到业务代码,来计算覆盖率了。

因此我们既需要指定测试代码路径(当然这里声明为 ./… 就可以了,只有_test 结尾的方法会自动作为测试方法),也需要指定业务代码路径(通过grep -v 和 tr 指令,最终将业务代码输出成 git/controller,git/database 的格式)

2、打开覆盖率报告

通过html 文件打开(推荐,能看到方法细节):

go tool cover -html=coverprofile.cov

在命令行直接查看:

go tool cover -func=coverprofile.cov

三、展望

当然我们可能会遇到一些特殊情况:比如不希望将init 方法也列入统计等等,这些后续再补充。

到此这篇关于golang使用go test输出单元测试覆盖率的方式的文章就介绍到这了,更多相关go test单元测试覆盖率内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中的指针自动解引用

    go语言中的指针自动解引用

    Go语言中,编译器会自动解引用指针来访问字段,自动解引用使得使用指针访问结构体字段和方法变得更加直观,降低了编程错误的风险,并使代码更易于理解和维护
    2024-10-10
  • GO语言中embed简介

    GO语言中embed简介

    这篇文章主要介绍了GO语言中embed简介的相关资料,需要的朋友可以参考下
    2023-08-08
  • Go并发原语之SingleFlight请求合并方法实例

    Go并发原语之SingleFlight请求合并方法实例

    本文我们来学习一下 Go 语言的扩展并发原语:SingleFlight,SingleFlight 的作用是将并发请求合并成一个请求,以减少重复的进程来优化 Go 代码
    2023-12-12
  • Go语言死锁与goroutine泄露问题的解决

    Go语言死锁与goroutine泄露问题的解决

    最近在工作中使用golang编程,今天的文章给大家分享一下Go语言死锁与goroutine泄露问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Golang栈结构和后缀表达式实现计算器示例

    Golang栈结构和后缀表达式实现计算器示例

    这篇文章主要为大家介绍了Golang栈结构和后缀表达式实现计算器示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go+Redis实现延迟队列实操

    Go+Redis实现延迟队列实操

    这篇文章主要介绍了Go+Redis实现延迟队列实操,延迟队列是一种非常使用的数据结构,我们经常有需要延迟推送处理消息的场景,比如延迟60秒发送短信,延迟30分钟关闭订单,消息消费失败延迟重试等
    2022-09-09
  • Golang unsafe包中的类型和函数详解

    Golang unsafe包中的类型和函数详解

    Golang中的unsafe包用于在运行时进行低级别的操作,这些操作通常是不安全的,因为可以打破Golang的类型安全性和内存安全性,使用 unsafe包的程序可能会影响可移植性和兼容性,接下来看下unsafe包中的类型和函数
    2023-08-08
  • 一文带你全面掌握Go语言中的正则表达式

    一文带你全面掌握Go语言中的正则表达式

    正则表达式是一种强大的模式匹配工具,能够在文本中进行灵活的搜索和替换操作,本文将介绍 Golang 中的正则表达式语法,包括常用的匹配符号、模式修饰符以及示例应用,希望对大家有所帮助
    2023-05-05
  • golang实现微信支付v3版本的方法

    golang实现微信支付v3版本的方法

    这篇文章主要介绍了golang实现微信支付v3版本的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  •  Go 语言实现 HTTP 文件上传和下载

     Go 语言实现 HTTP 文件上传和下载

    这篇文章主要介绍了Go语言实现HTTP文件上传和下载,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论