实际开发中,需要保证单元功能正确。

传统方式:在main函数中直接调用,查看结合是否和预期一致。

缺点:1. 不方便 2. 不利于管理 

因此,单元测试具有必要性

testing测试框架

Go语言中自带testing轻量级测试框架和go test命令来实现单元测试和性能测试。可以解决以下问题:

1. 确保每个函数可运行并且结果正确

2. 确保单元代码的性能

3. 尽早发现错误

入门实例以及解析

需求:在service包下有一个函数addUpper需要测试。

解决方式:在service包下创建一个xxx_test.go文件,创建一个测试用例,代码如下:

package serviceimport(_ "fmt""testing" //引入testing测试框架
)// 编写一个测试用例,测试同包下addUpper函数是否正确
func TestAddUpper(t *testing.T){// 调用res := addUpper(10)if res != 55{t.Fatalf("AddUpper执行错误,期望值%v,实际值%v", 55, res)}// 如果正确,就输出日志t.Logf("执行正确...")
}

使用命令行调用testing框架进行测试。

go test:Go 的测试命令,会自动查找当前目录及其子目录中所有以 _test.go 结尾的文件,并运行其中的测试函数。

-v(verbose):启用“详细输出”模式。在该模式下,测试过程中会打印出每个测试函数的执行情况(包括测试通过与否、执行顺序等),而不是只显示最终结果。

在 Go 的测试中,使用 t.Log("...") 或 t.Logf("format", args...) 输出的日志信息,默认只输出到控制台(终端),并不会自动写入文件或其他地方。如果需要写入.log文件需要指定。

PASS表示运行成功,FAIL表示运行失败。

1. 测试文件命名必须是 xxx_test.go
2. 测试函数名必须以 Test 开头且Test后一位必须为大写,如 TestSomething(t *testing.T)
3. 只有在包目录中有 _test.go 文件时,go test 才会运行测试

4. 所有用于执行单元测试的函数(即以 Test 开头的函数)都必须使用 t *testing.T 作为唯一的参数

5. 一个xxx_test.go文件中可以有多个测试函数,以测试一个包中不同的单元。

在测试函数中直接调用被测试函数即可,对结果进行判断,使用t的方法进行输出。

运行一个_test.go文件

go test自动查找当前目录及其子目录中所有以 _test.go 结尾的文件,但是如果想指定 _test.go文件,就在命令行中指定:

go test -v cal_test.go cal.go

go test:Go 的测试命令,用于运行测试。
-v:表示“verbose(详细输出)”,会显示每个测试函数的执行情况。
cal_test.go:测试文件,里面包含以 TestXXX 开头的测试函数。
cal.go:普通 Go 源文件,通常是你想测试的代码逻辑所在文件。

运行一个测试用例

go test -v -run ^TestAddUpper$
或者
go test -v -run TestAddUpper

这样只会运行该包下指定的一个测试用例, ^ 和 $ 是正则表达式符号,表示完全匹配函数名。不加也可以,但建议加上更精确。

单元测试综合案例

需求

构建结构体Monster,结构体两个方法Store和ReStore进行序列化和反序列化。

编写测试用例测试两个方法。

Monster结构体和方法代码:

package mainimport ("encoding/json""fmt""os"
)type Monster struct {Name  string `json:"name"`Age   int    `json:"age"`Skill string `json:"skill"`
}func (m *Monster) Store(filename string) error {// 序列化变量并保存到当前目录data, err := json.Marshal(m)if err != nil {return err}return os.WriteFile(filename, data, 0644)
}func (m *Monster) ReStore(filename string) error {// 反序列化变量并保存到当前目录data, err := os.ReadFile(filename)if err != nil {return err}return json.Unmarshal(data, m)
}func main() {// m := Monster{// 	Name:  "牛魔王",// 	Age:   800,// 	Skill: "魔王拳",// }// m.Store("MonsterJson.json")var m Monsterm.ReStore("MonsterJson.json")fmt.Println(m)
}

_test.go文件代码:

package mainimport ("os""reflect""testing"
)const testFile string = "monster.json"func TestStore(t *testing.T) {m := &Monster{Name:  "Dracula",Age:   500,Skill: "吸血",}err := m.Store(testFile)if err != nil {t.Fatalf("存储失败:%v", err)}// 检查文件是否存在if _, err := os.Stat(testFile); os.IsNotExist(err) {t.Fatal("文件未生成")}// 清理测试文件os.Remove(testFile)
}// TestRestore 测试 Restore 方法
func TestRestore(t *testing.T) {// 准备一个测试文件内容expected := &Monster{Name:  "Frankenstein",Age:   200,Skill: "雷电之力",}// 先将预期对象存入文件err := expected.Store(testFile)if err != nil {t.Fatalf("准备测试文件失败:%v", err)}// 创建一个新的 Monster 实例并恢复数据var restored Monstererr = restored.ReStore(testFile)if err != nil {t.Fatalf("恢复失败:%v", err)}// 使用reflect.DeepEqual判断两个值是否深度一致if !reflect.DeepEqual(expected, &restored) {t.Errorf("期望值 %v,实际值 %v", expected, restored)}// 清理测试文件os.Remove(testFile)
}

结果

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

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

相关文章

Vue移动端开发的适配方案与性能优化技巧

文章目录 1. 移动端适配方案1.1. 视口适配1.2. 基于rem/em的适配方案1.3. vw/vh视口单位适配1.4. 移动端UI组件库适配 2. 移动端性能优化技巧2.1. 虚拟列表实现长列表优化2.2. 图片懒加载与优化2.3. 减少首屏加载时间2.4. 事件节流与防抖 3. 移动端常见问题解决方案3.1. 移动端…

如何微调和部署OpenVLA在机器人平台上

这个教程来自这个英伟达网址 教程的目标是提供用于部署 VLA 模型的优化量化和推理方法,以及针对新机器人、任务和环境的参考微调流程。在一个自包含的仿真环境中,结合场景生成和领域随机化(MimicGen)对性能和准确性进行严格验证。…

深入剖析Flink内存管理:架构、调优与实战指南

在大数据处理领域,Apache Flink凭借强大的流处理和批处理能力备受青睐。而Flink内存管理机制,作为保障作业高效稳定运行的关键支柱,深刻影响着任务执行性能、资源利用率以及系统容错能力。理解并掌握Flink内存管理原理与优化策略,…

【力扣 C】动态规划专题目录

【力扣 简单 C】509. 斐波那契数https://blog.csdn.net/2503_92320911/article/details/148810148 【力扣 中等 C】983. 最低票价https://blog.csdn.net/2503_92320911/article/details/148833421 【力扣 中等 C】91. 解码方法https://blog.csdn.net/2503_92320911/article/d…

Linux 中如果网络连接丢失或无法找到网络设备

如下步骤 1. 检查网络服务状态 sudo systemctl status NetworkManager 如果服务未运行,启动并启用它: sudo systemctl start NetworkManager sudo systemctl enable NetworkManager ______ 2. 检查网络接口 ip add 确认网卡(如 eth0、en…

【Linux 平台总线驱动开发实战】

Linux 平台总线驱动开发实战 一、平台总线驱动基础概念二、核心数据结构解析2.1 设备结构体 struct platform_device2.2 驱动结构体 struct platform_driver2.3 资源结构体 struct resource 三、驱动开发完整流程3.1 设备注册3.2 驱动注册3.3 设备与驱动匹配 四、编译与测试4.1…

LabVIEW液位上升图像识别 附件有源码

源程序在这里https://www.bjcyck.com/nd.jsp?fromColId101&id2675#_np101_331 本LabVIEW 程序实现基于图像灰度特征的液位上升监测与控制,通过读取序列液位上升图像,分析指定区域灰度变化获取液位斜率,依据设定标记位置实现液位上升到目…

git安装使用详细教程

git高速下载 macOS 系统 # 方法1:Homebrew(推荐) brew install git# 方法2:官方安装包 下载地址:https://sourceforge.net/projects/git-osx-installer/Linux 系统 # Debian/Ubuntu sudo apt update && sudo…

玛哈特机械矫平机:精密制造的“应力消除师”与“平整度雕刻家”

机械矫平机,作为金属板材加工链中的关键一环,其价值远不止于“压平”那么简单。它是材料科学、精密机械与控制技术的结晶,是确保高端制造品质的幕后功臣。本文将深入探讨其核心机理、进阶应用及未来方向。 一、 矫平机理再探:超越…

四色(定理/猜想)染色算法小软件Version1.11 2025.6.24 开发者:孝感动天/卧冰求鲤

四色(定理/猜想)染色算法小软件Version1.11 2025.6.24 开发者:孝感动天/卧冰求鲤 开发者:路人甲/打酱油 开发者:四色定要治理/四邻不安/相邻必反/草木皆兵/围棋紧箍/不是我~干的/和我无关 开发者:不是我/不是我干的&#xff0c…

SQL 分页方法全解析:从基础到高级应用

一、引言 在 Web 应用和数据分析中,分页是处理大量数据的必备功能。想象一下,如果没有分页,社交媒体的动态流、电商平台的商品列表都将变成无穷无尽的长页面,用户体验和系统性能都会受到严重影响。本文将深入探讨 SQL 中各种分页方…

STM32 adc采集数据存到SD卡中

F1板子实现adc采集模拟信号存储到SD卡中 STM32 adc采集数据存到SD卡中/STM32SD文件系统ADC采集/AD/adc_dma.c , 10291 STM32 adc采集数据存到SD卡中/STM32SD文件系统ADC采集/AD/adc_dma.h , 661 STM32 adc采集数据存到SD卡中/STM32SD文件系统ADC采集/CMSIS/core_cm3.c , 17273…

redis8.0新特性:布谷鸟过滤器(Cuckoo Filter)详解

文章目录 一、写在前面二、使用1、CF.RESERVE 创建布谷鸟过滤器2、CF.ADD 添加元素3、CF.ADDNX 不存在才添加4、CF.COUNT 判断元素添加次数5、CF.DEL 删除一次元素6、CF.EXISTS 判断元素是否存在7、CF.MEXISTS 批量判断元素是否存在8、CF.INFO 查看布谷鸟过滤器信息9、CF.INSER…

2025 Java秋招『面试避坑指南』:牛客网高频题分类精讲

前言 今天为大家整理了目前互联网出现率最高的大厂面试题,所谓八股文也就是指文章的八个部分,文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成,题目一律出自四书五经中的原文。 初中级和中高级都有&#xff0c…

git安装使用和git命令大全

Git高速下载 程序员面试资料大全|各种技术书籍等资料-1000G Git 命令大全 一、基础操作 1. 初始化与克隆 命令说明示例git init初始化本地仓库git initgit clone克隆远程仓库git clone https://github.com/user/repo.gitgit remote add添加远程仓库git remote ad…

非常好用的markdown转pdf工具

在文档处理和知识管理中,Markdown因其简洁易读的特性而广受欢迎,而PDF格式则因其广泛的兼容性和稳定性而被广泛用于文档分享和存档。然而,将Markdown文档高效地转换为PDF格式,同时保留格式和样式,一直是许多用户的需求…

八股文——JAVA基础:基本数据类型与包装类的区别

基本数据类型包含八种, 1.用途不同,在目前编程而言,基本除了使用局部变量会使用基本数据类型外,都会去使用包装类。包装类能够适用泛型是目前企业编程使用包装类的主要原因,而基本类型不行。除此之外,包装…

从0开始学习R语言--Day30--函数型分析

在研究离散变量之间的影响时,我们往往只能获取类似中位数,平均数点来额外数据特点;但如果数据本身具有时间特性的话,我们可以尝试运用函数型分析,将静态的离散点转为动态过程来分析,即若本来是分析离散点对…

Agent轻松通-P3:分析我们的Agent

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 1 引言2 使用工具分析Agent:”日志“…

如何将FPGA设计验证效率提升1000倍以上(1)

我们将以三个设计样例,助力您提升设计开发效率。 对于FPGA应用开发来说,代码是写出来的,更是调试出来的。软件仿真拥有最佳的信号可见性和调试灵活性,被大多数工程师熟练使用,能够高效捕获很多显而易见的常见错误。 …