Go语言测试全攻略:从单元测试到模糊测试

news/2025/10/27 15:09:13/文章来源:https://www.cnblogs.com/qife122/p/19169151

Go语言测试指南

有些开发者通常选择不为代码编写测试,或者有很多不写测试的借口。我审视自己,也不喜欢编写测试,我认为这是出于懒惰,我写这篇文章是为了让自己理解测试为什么如此重要以及它如何让生活更轻松。

为什么需要测试?

典型的周五晚上。你已经放松下来,喝着一杯茶。但这时,你的DevOps同事发来了应用程序错误截图的消息。经过紧张的状态和日志排查,我们找到了那行让所有人都无法安心生活的代码。我不希望经常遇到这种情况,也不希望未来再受同样的折磨。我们需要通过测试和整洁代码来关注软件质量,让我们看看在Go中如何进行测试。

Go的测试支持

毫不奇怪,Go将测试支持作为其标准库的一部分。Go让测试代码变得如此简单,没有任何借口不这样做。测试代码不应该是你在完成程序开发后才做的事情,使用Go的标准工具链,测试、模糊测试和基准测试可以在开发过程中进行。

单元测试示例

让我们从一个单元测试的例子开始。

添加一个以_test.go结尾的文件,定义一个以Test开头后跟大写字母的函数,并使用testing包提供的功能。

让我们编写一个在字符串数组中查找最长公共前缀的函数,并为longestCommonPrefix函数编写单元测试。

// 单元测试示例
func TestLongestCommonPrefix(t *testing.T) {result := longestCommonPrefix([]string{"flower", "flow", "flight"})expected := "fl"if result != expected {t.Errorf("Expected %s, got %s", expected, result)}
}

上面的单元测试有问题,它没有测试所有可能的测试用例。例如,对于["flower","flower","flower","flower"],测试将失败。

表驱动测试

要测试所有可能的案例,让我们使用表驱动测试,其中测试输入和预期输出在表中列出,一个循环遍历它们并执行测试逻辑。

func TestLongestCommonPrefixTableDriven(t *testing.T) {var tests = []struct {input    []stringexpected string}{{[]string{"flower", "flow", "flight"}, "fl"},{[]string{"dog", "racecar", "car"}, ""},{[]string{"flower", "flower", "flower", "flower"}, "flower"},}for _, test := range tests {if output := longestCommonPrefix(test.input); output != test.expected {t.Errorf("For input %v, expected %s, but got %s", test.input, test.expected, output)}}
}

测试代码会影响程序性能吗?

所有这些测试代码会使我的程序变得更大更慢吗?别担心!正如go test命令被设置为仅处理以_test.go结尾的文件一样,go工具中的各种其他命令(如go buildruninstall)也被设置为忽略以_test.go结尾的文件。go工具可以将你的程序代码编译成可执行文件,但会忽略你的测试代码,即使它保存在同一个包目录中。

测试覆盖率

编写健壮且可维护的应用程序最重要的部分之一是确保代码经过充分测试。当你处理大型代码库时,这一点尤其重要。在本节中,我们介绍代码覆盖率的基础知识以及如何使用它来帮助你编写更好的测试。

要编写最佳测试,你需要知道代码的哪些分支被测试覆盖。你可以通过生成代码覆盖率报告来做到这一点。

# 运行测试但不包含覆盖率信息
go test .# 运行测试并包含覆盖率信息
go test -cover .
# 输出: ok      api    (cached)    coverage: 40.5% of statements# 生成覆盖率配置文件
go test -coverprofile=c.out# 在浏览器中查看带注释的源代码
go tool cover -html=c.out

持续集成

测试是可以在CI/CD中自动化的过程之一。我们可以使用GitHub Actions创建一个持续集成(CI)管道,自动测试、验证和分析你的Go代码。

Go和GitHub Actions的持续集成 - Alex Edwards

模糊测试

模糊测试是一种自动测试类型,它持续操纵程序的输入以查找错误。Go模糊测试使用覆盖率指导智能地遍历被模糊测试的代码,以查找并向用户报告故障。由于它可以达到人类经常遗漏的边缘情况,模糊测试对于发现安全漏洞和弱点特别有价值。自Go 1.18及更高版本起支持模糊测试。

如Go参考中所述,模糊测试对于发现安全漏洞和弱点特别有用,让我们看一个示例,然后进行模糊测试。

模糊测试类似于测试,但在模糊测试开始时,开发人员提供一个"种子语料库"(种子语料库是用户指定的输入集)。这是一组有趣的输入,默认情况下将使用go test进行测试。这是使用go test和一个新标志-fuzz执行的。

go test -fuzz=Fuzz

运行命令后,模糊测试当然失败了。保护你的应用程序免受SQL注入攻击并不难,我们使用占位符作为参数。我用占位符更正了函数并再次运行模糊测试,但令人惊讶的是模糊测试又失败了。

func getUser(ctx context.Context, id string) (name, email string, err error) {err = db.QueryRow(context.Background(), "SELECT name, email FROM users WHERE id = $1", id).Scan(&name, &email)return
}/*
fuzz: elapsed: 0s, gathering baseline coverage: 0/69 completed
fuzz: minimizing 58-byte failing input file
fuzz: elapsed: 0s, gathering baseline coverage: 13/69 completedFAIL: FuzzGetUser (0.00s)main_test.go:29: error: ERROR: invalid byte sequence for encoding "UTF8": 0x9d (SQLSTATE 22021)Failing input written to testdata/fuzz/FuzzGetUser/dcd91b04a1ec03131270460a5181796e9873d7b04281b31656844aff949a5c5cTo re-run:go test -run=FuzzGetUser/dcd91b04a1ec03131270460a5181796e9873d7b04281b31656844aff949a5c5c
FAIL
exit status 1
*/

我尝试使用unicode.IsPrint()来验证字符串但没有成功,只有strconv.Quote()函数成功通过。

结论

模糊测试是一种强大的测试技术,用于发现软件应用程序中的安全漏洞或错误。模糊测试通常可以发现单元测试遗漏的错误,因为单元测试通常只包含你预测会导致失败的输入值。

Go测试综合指南 | The GoLand Blog

理解Go中的模糊测试 | The GoLand Blog
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/947738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

090_尚硅谷_循环控制基本介绍和入门

090_尚硅谷_循环控制基本介绍和入门1.for循环入门使用

2025锻造成型/多向锻造/锚杆托盘成型/粉末成型/拉伸成型/玻璃钢成型/复合材料成型/液压机推荐榜:山东威力重工机床领衔,工业 / 定制化液压设备优质厂家精选

2025 年工业制造、汽车零部件加工、金属成型等领域对液压机的需求持续细化,设备的 “高精度、节能性、场景定制能力” 成为企业选择的核心标准。经技术实力与服务口碑筛选,以下企业展现出突出竞争力,山东威力重工机…

JimuReport 积木报表 v2.1.5 版本发布,免费的可视化报表和大屏

JimuReport 积木报表 v2.1.5 版本发布,免费的可视化报表和大屏项目介绍积木报表,是一款免费的数据可视化报表,含报表、打印、大屏和仪表盘,像搭建积木一样完全在线设计!功能涵盖:复杂报表、打印设计、图表报表、…

2025实验室/小型/变压吸附/PSA/制氮机推荐榜:江阴三阳制氮机械领衔,工业/食品级制氮设备优质厂家精选

2025 年工业生产、食品加工、电子制造等领域对氮气的需求持续增长,制氮机作为核心供气设备,其 “节能性、稳定性、场景适配性” 成为企业选择的核心标准。经技术实力与服务口碑筛选,以下企业展现出突出竞争力,江阴…

人工智能背景下的智慧规划建设方案

在数字化浪潮席卷全球的今天,人工智能技术正以前所未有的深度和广度融入城市发展的各个领域。智慧规划作为城市现代化建设的核心环节,通过AI技术的赋能,正在从传统经验驱动转向数据驱动和智能决策的新模式。本文将系…

2025 年 10 月 OZON ERP,Temu ERP,Shopee ERP 公司最新推荐,聚焦跨平台能力与售后体系的实用指南

引言 随着跨境电商行业的蓬勃发展,OZON、Temu、Shopee 等平台成为众多企业拓展海外市场的重要阵地,专业的 ERP 系统则成为提升运营效率的关键。为帮助企业精准选择适配的 ERP 服务,本次测评由中国跨境电商协会联合行…

van-uploader 设置上传按钮的尺寸和预览图片的尺寸

<van-uploader 设置上传按钮的尺寸和预览图片的尺寸1 说明 1.1 代码<van-uploader file-list="{{ fileList }}"deletable="{{ true }}"max-count="10"multiple accept="ima…

2025 年 10 月进销存 erp,供应链 erp,零售 ERP 公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!

引言 随着企业数字化管理需求的持续升级,进销存 ERP、供应链 ERP 及零售 ERP 作为企业运营的核心工具,其性能与服务质量直接影响企业效率与市场竞争力。为精准筛选优质服务商,2025 年 10 月,中国软件行业协会联合企…

MM-SAM

SAM的局限性:1、依赖用户手动提示,用户在输入一张图片后,还需要给予手动提示,模型才能分割。** 2、当用户未提供输入掩码时,则掩码嵌入将被随机初始化的嵌入替换,导致性能下降。 MM-SAM的结构:(1)将BLIP用于图…

测试用例设计的艺术:等价类、边界值与判定表实战

在软件测试领域,测试用例设计是核心技能之一。无论你是手工测试还是自动化测试,编写高质量的测试用例都是确保软件质量的关键。今天,我们将重温三种最经典的黑盒测试方法:等价类划分、边界值分析和判定表,并通过一…

2025年半自动冲芯机生产厂家权威推荐榜单:半自动矽钢片冲芯机/半自动铁芯冲压机/半自动冲芯设备源头厂家精选

根据行业数据显示,全球半自动冲孔机市场在2024年销量约为45,000台,平均售价为18,500美元/台,预计到2031年市场销售额将达到92.36亿元,期间年复合增长率为5.8% 。这一增长主要受到中小企业自动化改造、定制化生产需…

2025 年给水用 pe 管,钢丝网骨架 pe 管,大口径 pe 管厂家最新推荐,实力品牌深度解析采购无忧之选!

引言 当前给水用 PE 管、钢丝网骨架 PE 管、大口径 PE 管在市政基建、水利工程等领域需求激增,塑料加工工业协会数据显示,此类管材在市政管网项目渗透率已达 68%,但不同厂家产品质量差距达 30%。为精准筛选优质厂家…

分销积分商城小程序系统:赋能商家的全场景营销解决方案

一、概述总结 这款分销积分商城小程序系统是一款深度融合分销与积分体系的全能营销工具,支持微信公众号与微信小程序多平台部署,通过微擎系统实现高效交付。系统以三级分销为核心架构,搭配灵活的会员等级体系与丰富…

图多多表情包斗图微信小程序:开启斗图新体验,赋能流量变现新可能

一、概述总结 图多多表情包斗图是一款专为微信小程序打造的斗图神器,内置海量优质斗图表情,能让用户轻松成为斗图王者。该小程序不仅具备丰富的表情相关功能,还支持多种广告形式,为运营者提供了多元的变现路径。其…

2025 年 10 月 PE 管道、PE 管材、HDPE 管、PE 管材管件厂家最新推荐,产能、专利、环保三维数据透视

引言 据塑料管道协会 2024 年度报告显示,PE 管市场年需求量已突破 120 亿米,但市场抽检合格率仅 76.3%,近五年因质量问题引发的工程事故直接损失超 50 亿元。2025 年四季度基建工程进入关键期,管材选型面临 “参数…

java(1)-安装JDK-mac

如何检查macOS上是否安装了JDK?终端输入命令: 输入 java -version,若显示版本号(如 java version "17.0.1")则已安装‌ 为什么要安装JDK?安装 JDK(Java Development Kit)是开发和运行 Java 程序的基…

2025 年燃气用 pe 管,pe 管件,矿用 pe 管厂家最新推荐,聚焦资质、案例、售后的深度解析

引言 2025 年 PE 管行业在燃气输送、矿山开采等领域的应用标准持续升级,为破解采购端资质辨别难、质量把控弱、售后无保障等痛点,塑料管道协会联合第三方检测机构开展专项测评。本次测评历时 3 个月,覆盖 30 余个省…

共享菜篮小程序管理系统:菜市场绿色租赁新选择,开启环保便捷新体验

一、概述总结 共享菜篮是一款专为菜市场场景打造的菜篮租借微信小程序它创新性地结合 RFID 硬件技术,实现菜篮租借全流程的智能化管理,用户通过小程序即可完成注册、缴纳押金、租篮、打卡、退篮等一系列操作,商家则…

易搜资料知识付费小程序:一站式资源变现解决方案

一、概述总结 易搜资料知识付费小程序是一款专为内容创业者、自媒体及教育培训机构打造的多行业资源变现 SAAS 系统,支持通过微擎系统交付微信小程序版本。该系统以简洁高效的搜索查询为核心,整合了多种格式文件的存…

关于CC引脚使用注意事项

CH32X035以及CH32L103均支持USB PD功能,在将PD CC引脚作为普通IO使用时,在配置上有一些注意事项需要注意。关于CH32X035 CC引脚使用注意事项: CH32X035 CC引脚为PC14、PC15引脚,如下图:在将CC引脚(PC14、PC15)作…