Go语言开发-单元测试怎么写

[golang开发]go语言开发做单元测试 go语言开发做单元测试 什么是单元测试 单元测试本质上也是源代码中的一部分,与普通代码的区别在于它是验证代码正确性的代码。可简单做个定义:单元测试是开发人员编写的、用于检测在特定条件下目标代码正确性的代码。 软件开发天生就具有复杂性,没人敢打包票说自己写的代码一点问题都没有,或者不经测试就能保证代码正确运行,可能你在这个执行路径下能够执行,殊不知还有其他路径,有一一去验证过吗,因此,要保证程序的正... 阅读详情

欢迎参观个人网站https://fangyuhui.com

开发环境GoLand,Go版本1.12.1

Go语言,单元测试怎么写

吴军老师讲过:

提高程序质量水平,可以从写单元测试这种可操作的事情做起。
Google为了保证工程师所写程序的质量,鼓励大家多写测试代码。
凡事做记录,这样可以避免狗熊掰棒子。
大部分人过分相信自己的记忆力,以为自己能记住,但实际上很快忘了。
做记录的好处是,在记录过程中,又思考了一遍,进步得会更快。

Google每周会进行单元测试竞赛,给获胜者发放证书和奖金。单元测试达不到规定的比例,代码不允许提交。
所以,想要成为一名优秀的工程师,写好单元测试是非常重要的。

在我看来,写单元测试相当于又做了一次记录,重新梳理了思路。下次回头看代码的时候,有助于理解,也能帮助别人看清你的代码是怎么写的。

了解了单元测试的重要性,接下来,我们来看看,具体到Go语言的开发中,单元测试怎么写。

Go语言是Google开发的,因为Google要求单元测试必须覆盖100%的代码,所以,Go语言的源码中几乎包含了所有函数和方法的单元测试代码。因此,对于学习Go语言来说,从阅读源码中的单元测试代码着手,是一个非常好的学习方法。可惜,这种六脉神剑般逆天的学习方法,从来没人跟我讲过。因为国内很多人都不重视单元测试,网上的各种课程、教程也从来都不讲单元测试,我觉得这是非常不可取的。各种几天、十几天入门某某语言的课程,几乎没有讲单元测试的。但是我认为,学习Java、Go、C++、Python等语言,一开始就要学写单元测试,这样非常有助于学习,能学得更快,养成写单元测试的习惯,也极其有利于日后的工作。

写单元测试并不难,尤其是Go语言,几乎所有的外部函数和方法,都有单元测试代码,也就是说,源码中提供了所有单元测试的范例,如果不会写,阅读源码中的单元测试,照着写,这样也顺便学习了Google的代码规范。

Go语言中的单元测试,分为【测试】和【基准性能测试】,【测试】就是看一个函数或方法,写的是否正确,能否得到预期的运行结果;【基准性能测试】就是指,测试一个函数或者方法的性能或效率,比如一个排序算法,排列一个包含1000万个元素的随机数组,总耗时是多少,内存开销是多少。

我们就以源码中的sort包为例,也就是Go语言中排序算法的包src/sort/sort_test.go,看一个一般的测试

var ints = [...]int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}
func TestReverseSortIntSlice(t *testing.T) {
	data := ints
	data1 := ints
	a := IntSlice(data[0:])
	Sort(a)
	r := IntSlice(data1[0:])
	Sort(Reverse(r))
	for i := 0; i < len(data); i++ {
		if a[i] != r[len(data)-1-i] {
			t.Errorf("reverse sort didn't sort")
		}
		if i > len(data)/2 {
			break
		}
	}
}

这段代码包含哪些信息呢?
首先,是测试函数的名字TestReverseSortIntSlice,以Test开头,后面跟着这段测试代码的名字(不一定是待测函数的名字,可以自己起名),ReverseSortIntSlice,反转排序int切片,其实就是测的Reverse函数,也就是把数组中所有元素的顺序倒过来。
该函数有个参数t *testing.T,这是Go单元测试的固定写法,只能有一个参数,参数类型为*testing.T,该函数没有返回值。
里面的具体实现是,先声明两个int数组,元素相同,里面有十几个整数,将第一个数组用Sort()函数排列(即从小到大正序排列),将第二个数组用Reverse()函数排列(即从大到小逆序排列),然后遍历两个数组,看看第二个数组中的最后一个元素是否等于第一个数组的第一个元素,依次比较,如果比到哪一个元素,发现不相等,则执行t.Errorf("reverse sort didn't sort")这段代码。
t.Errorf()函数的具体实现如下

// Errorf is equivalent to Logf followed by Fail.
func (c *common) Errorf(format string, args ...interface{}) {
	c.log(fmt.Sprintf(format, args...))
	c.Fail()
}

打印日志,并标记测试失败,函数继续运行,执行下一次遍历,打印的信息是自己写的"reverse sort didn’t sort",意即反转排序没有排序,表示测试失败。说明该Reverse()函数写得有问题。没有达到预期运行结果,没有将数组的顺序反过来。

这就是一段Go语言标准的单元测试范例,其中标记测试失败的方法除了t.Errorf()之外,还有以下几个,

// Fatal is equivalent to Log followed by FailNow.
func (c *common) Fatal(args ...interface{}) {
	c.log(fmt.Sprintln(args...))
	c.FailNow()
}

表示打印日志,并立即退出,与刚才的t.Errorf()函数不同,Fatal会在测试失败时立即退出,后面的代码不再运行了,Errorf函数则在测试失败后继续执行,并不立即退出。

func (c *common) Log(args ...interface{}) { c.log(fmt.Sprintln(args...)) }

表示打印日志,不标记成功与否,也不退出执行。

// Skipf is equivalent to Logf followed by SkipNow.
func (c *common) Skipf(format string, args ...interface{}) {
	c.log(fmt.Sprintf(format, args...))
	c.SkipNow()
}

表示打印日志,并跳过本段测试。

如果一个测试文件中有多个测试函数,比如这种

func TestSortIntSlice(t *testing.T) {…}
func TestSortFloat64Slice(t *testing.T) {…}
func TestSortStringSlice(t *testing.T) {…}
func TestInts(t *testing.T) {…}
func TestFloat64s(t *testing.T) {…}
func TestStrings(t *testing.T) {…}
func TestSlice(t *testing.T) {…}

如果运行的是这整个文件,那么这些测试函数会依次执行,直到所有的测试函数执行完毕,不管内部是否测试失败,这些函数每一个都会被执行。
在GoLand编译器中,提供了测试包的功能,就是一次运行一个包中所有的测试文件,而通常每一个测试文件中,都有好几个测试函数,最后控制台会打印所有测试函数的测试结果。

Go语言的单元测试,并不难写,但是写单元测试非常重要,今天先到这里,下一节,再看看【基准性能测试】怎么写。

欢迎参观个人网站https://fangyuhui.com

go单元测试及代码覆盖率 描述 Go语言官方则提供了语言级的单元测试支持,即testing包,而且仅通过go工具本身就可以方便地生成覆盖率数据,也就是说,单元测试是Go语言的自带属性,除了好好设计自己的单元测试用例外,开发者不需要操心工程搭建的任何细节。 逻辑代码 创建一个sum.go文件, 编写一下函数代码 // 求和 func Sum(a, b int) int{ return a + b } 单元测试 进行代码... 阅读详情

相关推荐

如何在 Go 中写出高效的单元测试

文章目录单测的重要性Go 单测基础知识基本规则go test 使用表格测试HTTP 测试其它测试框架TestifyGoConveyGinkGo其它 Mock 库GoMockHTTPMockSQLMock与 Docker 集成总结参考 单测的重要性 方便 debugging 方便代码重构 提升代码质量 使整个过程敏捷 Go 单测基础知识 基本规则 通常我们的单元测试代码都放在以 _test.go 结尾的文件中,该文件一般和目标代码放在同一个 package 中。 测试的方法以为 Test 开头,并且拥

Salted fish in hand, I have the world. 867

手把手教你写go单元测试

​ 在 Go 语言中,单元测试是一种测试方法,用于验证代码的某个独立单元是否按预期功能,它的目的是确保代码的每个组成部分都在独立测试的情况下运行正常。​ 在我们对项目新增一个新功能时,最好就要养成写单元测试的好习惯,这样可以有助于提高我们代码的质量、可维护性和可靠性。​ 在 Go 中,单元测试的约定是使用标准库中的testing包。测试文件通常以_test.go为后缀,然后我们使用配合一些参数去进行测试,Go 测试工具会自动识别并运行这些文件中那点测试样例。

1748

【Golang】深度解析go语言单元测试与基准测试

单元测试和性能测试是成为优秀程序员的必经之路。 在go语言里面,基准测试承担了性能测试的功能。 单元测试和基准测试代码开发中的重要环节,良好的单元测试和基准测试,能提升开发质量,对整体开发有非常重要的重要,下面介绍单元测试和基准测试的写法。

景天科技苑 5万+

Go Test 单元测试简明教程

Go语言单元测试的快速学习,迅速掌握基本的单元测试功能以及使用方法,快速上手应用!

2301_79819426的博客 1626

【go从入门到精通】golang单元测试

上面的命令会将覆盖率相关的信息输出到当前文件夹下面的c.out文件中,然后我们执行go tool cover -html=c.out,使用cover工具来处理生成的记录信息,该命令会打开本地的浏览器窗口生成一个HTML报告。类型的参数b,基准测试必须要执行b.N次,这样的测试才有对照性,b.N的值是系统根据实际情况去调整的,从而保证测试的稳定性。文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。

yolo模型训练找我,AI游戏合作找我 2万+

实战解析:从Innovus到Calibre的LVS错误排查全流程

本文详细解析了从Innovus到Calibre的LVS错误排查全流程,涵盖物理验证关键步骤与工具链协同。通过实战案例分享,重点解决器件不匹配、连接性错误等常见问题,并提供GDS导出规范、网表修正策略等实用技巧,帮助工程师高效完成芯片设计物理验证。

9o8p7i6u5y的博客 1038

golang单元测试及mock总结

golang的单元测试实践总结,包括mock各种函数,http调用呢

铁柱的博客 3万+

【超详细】数据分析笔试题分享,可以收藏后仔细阅读_数据分析岗位笔试题目

这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。15、在某座城市出现了某种流行病,且已知某座城市男女人数相同,男性患该病的概率为5%,女性为0.25%,现已知该城市的小明得了此病,请问小明为男性的概率是() B。D项,使用方差作为特征评分标准,如果某个特征的取值差异不大,通常认为该特征对区分样本的贡献度不大,因此在构造特征过程中去掉方差小于阈值的特征。LTV,用户生命周期价值,是产品从用户获取到流失所得到的全部收益的总和。

2401_89824744的博客 949

深入掌握 Golang 单元测试与性能测试:从零开始打造高质量代码!

单元测试是对代码中的最小可测试单元(如函数、方法)进行验证的测试方法。通过编写测试用例,我们可以确保函数在不同输入情况下能正确输出预期结果,避免代码中的逻辑错误。本文详细介绍了 Go 语言中单元测试与性能测试的基本方法和技巧。单元测试帮助我们确保代码的正确性,而性能测试则能优化代码的运行效率。通过编写良好的测试,我们可以提升程序的健壮性,减少运行时错误,并优化性能。希望本文对你有所帮助,让大家可以更好地掌握 Go 语言的测试机制。测试是开发中的重要一环,掌握这些技能将为你的编程之路打下坚实的基础。

Linke的博客 3303

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程

本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。

2301_80014343的博客 1435

ROS 2 Humble + Gazebo Fortress 搭建AGV小车仿真环境(保姆级避坑指南)

本文详细介绍了如何使用ROS 2 Humble和Gazebo Fortress搭建AGV小车仿真环境,包括环境准备、URDF模型构建、ROS 2控制集成、传感器配置等关键步骤。特别针对Gazebo Fortress版本差异提供了保姆级避坑指南,帮助开发者快速解决常见问题并优化性能。

weixin_29044157的博客 200

go get 代理_2020,你需掌握go 单元测试进阶篇

本文说明go语言自带的测试框架未提供或者未方便地提供的测试方案,主要是用于解决写单元测试中比较头痛的依赖问题。也就是伪造模式,经典的伪造模式有桩对象(stub),模拟对象(mock)和伪对象(fake)。比较幸运的是,社区有丰富的第三方测试框架支持支持。下面就对笔者亲身试用并实践到项目中的几个框架做介绍:1.gomockgomock模拟对象的方式是让用户声明一个接口,然后使用gomock提供的mo...

weixin_36474966的博客 105

噪声整形与过采样实战:从N-bit ADC到DSM的SQNR优化指南

本文深入探讨了噪声整形与过采样技术在DSM(Delta-Sigma调制器)中的应用,重点分析了量化器位数(N)、滤波器阶数(L)和过采样率(OSR)对SQNR优化的影响。通过实战案例和参数协同优化策略,帮助工程师在音频处理和通信系统设计中实现更优的信号质量。

weixin_42561040的博客 340

代码管理规范_如何写出优雅的 Go 语言代码

Go 语言是一门简单、易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问题的,想要真正融入生态写出优雅的代码就一定要花一些时间和精力了解语言背后的设计哲学和最佳实践。如果你之前没有 Go 语言的开发经历,正在学习和使用 Go 语言,相信这篇文章能够帮助你更快地...

weixin_39637256的博客 159

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3792

58.Sobel边缘检测算子

注:在梯度运算中,很可能会出现负的灰度值,我们不能再采用uint8类型作为像素的数据类型,而是采用了CV_16S或者CV_32F这种有负数范围的类型,运算结果里的负数也不能不处理,否则在显示的时候就会被截断为0,这样就会丢失边界信息。如下图所示,对中心像素Z5求取多个方向的灰度差分,对于Z5的8邻域,分为4个方向,即对角线和水平垂直4个方向对:(z1, z9) ,(z2, z8), (z3, z7), (z6, z4) 给定邻域方向梯度矢量g的幅度为:|g| = <像素灰度差分>/<相邻像素的距离>。

twnkie的博客 4884

Golang单元测试

代码测试是软件开发中的一项重要实践,用于验证代码的正确性、可靠性和预期行为。通过代码测试,开发者可以发现和修复潜在的错误、确保代码按预期工作,并提高系统的质量和稳定性。单元测试是针对代码中最小的可测试单元(如函数、方法或类)进行的测试,以验证代码单元在给定输入下的行为是否正确。单元测试通常由开发者编写,并使用特定的测试框架和断言库来定义测试用例、执行测试代码,并验证测试结果。例如,现在要求对cal.go文件中的函数进行代码测试。

2021dragon的博客 2414

(八)DDR_PHY架构及功能——(PUB组成、初始化及Training流程、Clock关系)

文章目录一、DDR_PHY结构组成1.1、DDR Memory子系统1.2、DDR_PHY架构组成1.3、PUB模块功能实现流程1.3.1、DDR系统初始化流程1.3.2、PLL初始化流程 一、DDR_PHY结构组成 1.1、DDR Memory子系统   Memory子系统主要由DDR Controller和DDR_PHY(含DDR_IO)两个部分组成。DDR Controller主要承担其它子系统(如CPU)与Memory子系统进行数据交互时的传输效率及调度,DDR_PHY主要负责数据交互过程中的传输速

Mr.翟的博客 1万+

Go语言 单元测试

单元测试是软件开发中的一种测试方法,旨在验证代码中最小可测试单元(如函数、方法、类)的行为是否符合预期,它是开发流程的重要组成部分。单元测试的目标是发现代码中的缺陷和错误,并确保代码的正确性和稳定性。Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试。在包目录内,以_test.go为后缀名的源文件都是go test的一部分,而不是go build的构建部分。

fbbqt的博客 1234

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【go语言开发】编写单元测试

在go语言中编写单元测试时,使用说明测试文件命名:在 Go 语言中,测试文件的命名应与被测试的源代码文件相同,但以 “_test” 结尾。例如,如果你的源代码文件名为 example.go,则测试文件名应为 example_test.go。导入 testing 包:在测试文件的开头,导入 testing 包,这是 Go 语言内置的用于编写单元测试的包。编写测试函数:测试函数的命名应以 “Test” 开头,后面跟着被测试的函数名,并接收一个参数 t *testing.T。

Miao的博客 1859

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

golang web补充知识:单元测试

单元测试是软件开发过程中的一种质量保证方法,它通过对软件中的最小可测试单元进行检查和验证,确保每个单元都能按照预期工作,文章介绍单元测试在golang中的编写和应用方法

loo_Charles_ool的博客 2361

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Go 语言中的单元测试

本文介绍了Go语言单元测试的核心方法和技巧。主要内容包括:1) go test命令的使用和测试文件命名规范;2) 测试函数类型(功能测试、性能测试等)及其编写方法;3) 通过-short标志管理耗时测试;4) 表格驱动测试的实现方式;5) 性能测试的编写和字符串拼接性能对比分析。文章强调单元测试对保障代码质量的重要性,并提供了具体示例帮助开发者快速掌握测试技能,特别是性能测试结果显示strings.Builder在字符串拼接中性能最优。

一切总会归于平淡 1360

Go语言- 单元测试

实际开发中,需要保证单元功能正确。传统方式:在main函数中直接调用,查看结合是否和预期一致。缺点:1. 不方便 2. 不利于管理因此,单元测试具有必要性。

Hunter_11的博客 787

golang开发技能

本文主要介绍go相关 开发技巧、调试技巧、工具使用、单元测试、基准测试、性能测试相关。

mijichui2153的博客 1552

单元测试(go)

本文主要针对golang语言的单元测试工具,博客内容也会涉及一些单元相关的内容 什么是单元测试:单元测试是软件测试体系中最基础、最核心的测试类型,它聚焦于对软件系统中最小的 “可测试单元” 进行独立验证,确保该单元的功能符合预期设计。 简单描述下前因后果:工作需要对项目代码系统化执行单元测试,要求覆盖率达到95%以上,因为不同人的开发风格和代码习惯,外加项目框架和架构的一些要求。单元测试,这个东西一般情况都会让人很痛苦,至于因为啥,我相信看到我这篇博客的各位,都是有不同程度的感同身受的

有用的话关个注,点个赞,收个藏🫶。 989
上一篇: LeetCode第一题:两数之和
下一篇: Mac如何安装LLVM
Elonjelinek
博客等级 码龄9年 77粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值