golang单元测试

server/2025/1/16 18:23:44/

单元测试

类型前缀签名用途
测试函数Testfunc TestXxx(t *testing.T)功能测试、验证逻辑正确性
基准函数Benchmarkfunc BenchmarkXxx(b *testing.B)性能测试、效率评估
示例函数Examplefunc ExampleXxx()用法展示、生成文档

testing框架

  1. 文件名以_test.go结尾,放在与被测试包相同的包中
  2. 测试用例函数名以Test开头,一般为Test+被测试的函数名)
  3. **TestaddUpper(*testing.T)**的形参类型必须是*testing.T
  4. 一个测试用例文件中,可以有很多测试用例函数,比如TestAddUpper、TestSub
  5. 运行测试用例指令
    • cmd>go test [运行正确,无日志;运行错误,输出日志]
    • cmd>go test -v [运行正确或是错误,都将输出日志]
  6. t.Fatalf方法可以格式化输出错误信息,并退出程序
  7. t.Logf方法可以输出相应日志
  8. PASS表示运行成功,FAIL表示运行失败
func addUpper(n int) int {res := 0for i := 1; i <= n; i++ {res += i}return res
}func TestAddUpper(t *testing.T) {res := addUpper(10)if res != 55 {//fmt.Println("AddUpper(10) 执行错误,期望值=%v 实际值=%v", 55, res)t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v", 55, res)}//如果正确,输出日志t.Logf("AddUpper(10) 执行正确...")
}

实例:

// 给Monster绑定方法Store,可以将一个Monster变量(对象),序列化后保存到文件中
func (this *Monster) Store() bool {//先序列化data, err := json.Marshal(this)if err != nil {fmt.Println("marshal err =", err)return false}//保存到文件filePath := "D:\\GoLand-go\\filedemo.txt"err = ioutil.WriteFile(filePath, data, 0666)if err != nil {fmt.Println("write file err =", err)return false}return true
}// 给Monster绑定方法ReStore,可以将一个序列化的Monster,从文件中读取
// 并且反序列化为monster对象,检查反序列化,名字正确
func (this *Monster) ReStore() bool {//先从文件中,读取序列化的字符串filePath := "D:\\GoLand-go\\filedemo.txt"data, err := ioutil.ReadFile(filePath)if err != nil {fmt.Println("ReadFile err =", err)return false}//使用读取到data []byte,对反序列化err = json.Unmarshal(data, this)if err != nil {fmt.Println("UnMarshal err = ", err)return false}return true
}// 测试用例,测试Store方法
func TestMonster_Store(t *testing.T) {//先创建一个Monster实例monster := Monster{Name:  "红孩儿",Age:   10,Skill: "吐火",}res := monster.Store()if !res {t.Fatalf("monster.Store() 错误,希望为=%v 实际为=%v", true, res)}t.Logf("monster.Store() 测试成功!")
}// 测试用例,测试ReStore方法
func TestMonster_ReStore(t *testing.T) {//先创建一个Monster实例,不需要指定字段的值var monster Monsterres := monster.ReStore()if !res {t.Fatalf("monster.ReStore() 错误,希望为=%v 实际为=%v", true, res)}//进一步判断if monster.Name != "红孩儿" {t.Fatalf("monster.ReStore() 错误,希望为=%v 实际为=%v", "红孩儿", monster.Name)}t.Logf("monster.ReStore() 测试成功!")
}

基准测试

基准测试以Benchmark为前缀,需要一个testing.B类型的参数b*,基准测试必须要执行b.N次,这样的测试才有对照性,b.N的值是系统根据实际情况去调整的,从而保证测试的稳定性

基准测试并不会默认执行,需要增加**-bench参数(还可以为基准测试添加-benchmem**参数,来获得内存分配的统计数据)

默认情况下,每个基准测试至少运行1秒。如果在Benchmark函数返回时没有到1秒,则b.N的值会按1,2,5,10,20,50,…增加,并且函数再次运行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

b.ResetTimer之前的处理不会放到执行时间里,也不会输出到报告中,所以可以在之前做一些不计划作为测试报告的操作


http://www.ppmy.cn/server/158883.html

相关文章

32单片机综合应用案例——智能家居灯光控制系统(二)(内附详细代码讲解!!!)

"即使世界看似残酷&#xff0c;也要坚持自己的梦想&#xff0c;因为只有这样&#xff0c;你才能创造属于自己的奇迹。”“不要害怕失败&#xff0c;因为失败是成功的垫脚石。”“即使跌倒了一百次&#xff0c;也要勇敢地爬起来一百零一次。”“永远不要低估自己的潜力&…

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…

我的年度总结

这一年的人生起伏&#xff1a;从曙光到低谷再到新的曙光 其实本来没打算做年度总结的&#xff0c;无聊打开了帅帅的视频&#xff0c;结合自己最近经历的&#xff0c;打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…

【Python通过UDP协议传输视频数据】(界面识别)

提示&#xff1a;界面识别项目 前言 随着网络通信技术的发展&#xff0c;视频数据的实时传输在各种场景中得到了广泛应用。UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的协议&#xff0c;凭借其低延迟、高效率的特性&#xff0c;在实时性要求较高的视频…

Go-Zero整合Goose实现MySQL数据库版本管理

推荐阅读 【系列好文】go-zero从入门到精通&#xff08;看了就会&#xff09; 教程地址&#xff1a;https://blog.csdn.net/u011019141/article/details/139619172 Go-Zero整合Goose实现MySQL数据库版本管理的教程 在开发中&#xff0c;数据库迁移和版本管理是必不可少的工作。…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

【Linux】从零开始:编写你的第一个Linux进度条小程序

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具 文章目录 一、知识铺垫1.1 回车与换行概念1.2 缓冲区 二、实现简单倒计时三、进度条3.1 Verrs…

电动汽车V2G技术Matlab/Simulink仿真模型

今天给大家更新关于V2G技术的仿真&#xff0c;不是研究这个方向的&#xff0c;可能会对这个名称比较陌生&#xff0c;那么&#xff0c;什么是“V2G”&#xff1f; V2G全称&#xff1a;Vehicle-to-Grid&#xff0c;即车网互动&#xff0c;利用电动汽车特有的储能功能与电网“双…