显示没有盲点的功能测试覆盖率
各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《显示没有盲点的功能测试覆盖率》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到golang等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!
问题内容
我有一个不是用 golang 编写的生产 golang
代码和功能测试。功能测试运行编译的二进制文件。我的生产代码的非常简化的版本在这里main.go::
package main
import (
"fmt"
"math/rand"
"os"
"time"
)
func main() {
rand.Seed(time.Now().UTC().UnixNano())
for {
i := rand.Int()
fmt.Println(i)
if i%3 == 0 {
os.Exit(0)
}
if i%2 == 0 {
os.Exit(1)
}
time.Sleep(time.Second)
}
}
我想为我的功能测试构建覆盖率配置文件。为了做到这一点,我添加main_test.go了包含内容的文件:
package main
import (
"os"
"testing"
)
var exitCode int
func Test_main(t *testing.T) {
go main()
exitCode =
并修改main.go:
package main
import (
"flag"
"fmt"
"math/rand"
"os"
"runtime"
"time"
)
var exitCh chan int = make(chan int)
func main() {
rand.Seed(time.Now().UTC().UnixNano())
for {
i := rand.Int()
fmt.Println(i)
if i%3 == 0 {
exit(0)
}
if i%2 == 0 {
fmt.Println("status 1")
exit(1)
}
time.Sleep(time.Second)
}
}
func exit(code int) {
if flag.Lookup("test.coverprofile") != nil {
exitCh
然后我构建覆盖二进制文件:
go test -c -coverpkg=. -o myProgram
然后我的功能测试运行这个覆盖二进制文件,如下所示:
./myProgram -test.coverprofile=/tmp/profile
6507374435908599516
PASS
coverage: 64.3% of statements in .
我构建了显示覆盖率的 HTML 输出:
$ go tool cover -html /tmp/profile -o /tmp/profile.html
$ open /tmp/profile.html

问题
由于条件,方法exit永远不会显示 100% 的覆盖率if flag.Lookup("test.coverprofile") != nil。所以这条线os.Exit(code)对于我的覆盖结果来说有点盲点,尽管事实上,功能测试在这条线上进行,这条线应该显示为绿色。
另一方面,如果我删除 condition if flag.Lookup("test.coverprofile") != nil,该行将os.Exit(code)终止我的二进制文件而不构建覆盖率配置文件。
如何 重写exit()并且可能显示 没有盲点main_test.go的覆盖? ****
想到的第一个解决方案是time.Sleep():
func exit(code int) {
exitCh
但这不是很好,因为会导致生产代码在退出前变慢。
正确答案
根据我们在评论中的对话,我们的覆盖率配置文件永远不会包含该行代码,因为它永远不会被执行。
如果没有看到你的完整代码,很难想出一个合适的解决方案,但是你可以做一些事情来增加覆盖率而不会牺牲太多。
func Main 和 TestMain
标准做法GOLANG是避免测试主应用程序入口点,以便大多数专业人员将尽可能多的功能提取到其他类中,以便轻松测试它们。
GOLANG测试框架允许您在没有 main 函数的情况下测试您的应用程序,但您可以在其中使用 TestMain
函数,该函数可用于测试代码需要在主线程上运行的位置。下面是GOLANG
测试的一个小尝试。
有时测试程序需要在测试之前或之后进行额外的设置或拆卸。有时还需要测试来控制哪些代码在main线程上运行。为了支持这些和其他情况,如果测试文件包含一个函数:func TestMain(m *testing.M)
查看GOLANG 测试以获取更多信息。
工作示例
下面是一个测试代码所有功能的示例(覆盖率为 93.3%,我们将使其达到 100%)。我对您的设计进行了一些更改,因为它不适合测试,但功能仍然相同。
包主
dofunc.go
import (
"fmt"
"math/rand"
"time"
)
var seed int64 = time.Now().UTC().UnixNano()
func doFunc() int {
rand.Seed(seed)
var code int
for {
i := rand.Int()
fmt.Println(i)
if i%3 == 0 {
code = 0
break
}
if i%2 == 0 {
fmt.Println("status 1")
code = 1
break
}
time.Sleep(time.Second)
}
return code
}
dofunc_test.go
package main
import (
"testing"
"flag"
"os"
)
var exitCode int
func TestMain(m *testing.M) {
flag.Parse()
code := m.Run()
os.Exit(code)
}
func TestDoFuncErrorCodeZero(t *testing.T) {
seed = 2
if code:= doFunc(); code != 0 {
t.Fail()
}
}
func TestDoFuncErrorCodeOne(t *testing.T) {
seed = 3
if code:= doFunc(); code != 1 {
t.Fail()
}
}
main.go
package main
import "os"
func main() {
os.Exit(doFunc());
}
运行测试
如果我们使用封面配置文件构建我们的应用程序。
$ go test -c -coverpkg=. -o example
并运行它。
$ ./example -test.coverprofile=/tmp/profile
运行测试
1543039099823358511
2444694468985893231
6640668014774057861
6019456696934794384
status 1
PASS
coverage: 93.3% of statements in .
所以我们看到我们得到了 93%
的覆盖率,我们知道这是因为我们没有任何测试覆盖率main来解决这个问题,我们可以为它编写一些测试(不是一个好主意),因为代码有os.Exit或者我们可以重构它所以它非常简单,功能很少,我们可以将其从测试中排除。
main.go要从覆盖率报告中排除文件,我们可以tags通过在文件的第一行放置标记注释来使用构建main.go。
//+build !test
有关构建标志的更多信息,请查看此链接:[http ://dave.cheney.net/2013/10/12/how-to-use-conditional-
compilation-with-the-go-build-tool](http://dave.cheney.net/2013/10/12/how-to-
use-conditional-compilation-with-the-go-build-tool)
这将告诉GOLANG该文件应该包含在标签构建存在但NOT标签测试存在的构建过程中。
查看完整代码。
//+build !test
package main
import "os"
func main() {
os.Exit(doFunc());
}
我们需要构建稍微不同的覆盖应用程序。
$ go test -c -coverpkg=. -o example -tags test
运行它会是一样的。
$ ./example -test.coverprofile=/tmp/profile
我们得到下面的报告。
1543039099823358511
2444694468985893231
6640668014774057861
6019456696934794384
status 1
PASS
coverage: 100.0% of statements in .
我们现在可以构建覆盖 html 了。
$ go tool cover -html /tmp/profile -o /tmp/profile.html
今天关于《显示没有盲点的功能测试覆盖率》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
Azure SQL 数据库错误 TLS 握手自 v12 升级以来失败
- 上一篇
- Azure SQL 数据库错误 TLS 握手自 v12 升级以来失败
- 下一篇
- 通过 Cloud Datastore API 连接到开发中的 AppEngine 数据存储
-
- Golang · Go问答 | 4天前 | interface · 单元测试 · 架构设计 · repository · Go问答 · 单元测试 架构设计 interface 接口设计 Go问答 调用方定义 Repository
- Go interface 应该放在哪一层?为什么更推荐调用方定义小接口
- 212浏览 收藏
-
- Golang · Go问答 | 4天前 | JSON · time.Time · 接口设计 · Go问答 · encoding/json · encoding/json API响应 JSON序列化 time.Time omitempty Go问答 omitzero
- Go JSON 里的 omitempty 为什么漏不掉 time.Time?omitzero 和指针怎么选
- 315浏览 收藏
-
- Golang · Go问答 | 4天前 | JSON · 后端开发 · Go问答 · encoding/json · 接口解析 · JSON解析 encoding/json DisallowUnknownFields Go问答 RawMessage json.Decoder UseNumber
- Go 解析 JSON 怎么选:struct、map、RawMessage 还是 Decoder
- 151浏览 收藏
-
- Golang · Go问答 | 4天前 | HTTP · net/http · Go问答 · 流式响应 · ResponseController · net/http FLUSH 流式响应 Go问答 ResponseController FullDuplex 写超时
- Go http.ResponseController 有什么用?Flush、写超时和 FullDuplex 这样理解
- 161浏览 收藏
-
- Golang · Go问答 | 5天前 | HTTP · sse · Go问答 · 用户体验 · 流式响应 · Go EventSource SSE Go问答 Server-Sent Events 长任务进度 http.Flusher
- Go 长任务接口怎么返回进度?SSE 流式推送的最小写法
- 293浏览 收藏
-
- Golang · Go问答 | 5天前 | Timer · 性能优化 · time.After · Go问答 · Go 内存优化 Timer time.After Go问答 time.NewTimer Go1.23
- Go time.After 放在循环里还会泄漏吗?从 Go 1.23 变化到工程写法
- 384浏览 收藏
-
- Golang · Go问答 | 5天前 | go · Context · 并发编程 · 接口超时 · 超时控制 goroutine泄漏 WithTimeout Go context Go问答 CancelFunc
- Go context 超时取消为什么重要:从接口耗时到 goroutine 泄漏的治理思路
- 477浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4109次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 3822次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 3809次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 3986次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 3958次使用
-
- GOLANG使用Context管理关联goroutine的方法
- 2022-12-28 193浏览
-
- 聊聊Go中的注释和godoc工具
- 2022-12-29 354浏览
-
- 聊聊Golang语言中的复数类型
- 2023-01-07 418浏览
-
- 浅析Golang中的浮点类型(float32和float64)
- 2022-12-23 161浏览
-
- 聊聊Golang中的整数类型
- 2022-12-24 209浏览


