golang单元测试

devtools/2025/1/15 4:48:04/

单元测试

类型前缀签名用途
测试函数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/devtools/150228.html

相关文章

Go语言中http.Transport的Keep-Alive配置与性能优化方法

在Go语言中&#xff0c;http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具&#xff0c;它提供了许多可配置的参数以优化性能。其中&#xff0c;Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释&#xff1a; 一、…

12 USART串口通讯

1 串口物理层 两个设备的“DB9接口”之间通过串口信号建立连接&#xff0c;串口信号线中使用“RS232标准”传输数据信号。由于RS232电平标准的信号不能直接被控制器直接识别&#xff0c;所以这些信号会经过“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号&#xff…

基于R语言的DICE模型实践技术应用;评估气候变化对经济的影响以及不同减排政策的经济成本和效益

DICE模型是一个动态综合气候经济模型&#xff0c;由诺贝尔经济学奖得主William Nordhaus开发&#xff0c;用于评估气候变化对经济的影响以及不同减排政策的经济成本和效益。以下是一个关于DICE模型在气候变化影响评估中的实际应用案例&#xff0c;结合R语言代码进行讲解。 实际…

Clojure语言的数据结构

Clojure语言的数据结构解析 Clojure是一种现代的函数式编程语言&#xff0c;构建于JVM之上。作为一种函数式语言&#xff0c;Clojure不仅强调不可变性&#xff0c;还提供了丰富的数据结构来支持高效的开发。在本篇文章中&#xff0c;我们将探索Clojure语言中一些核心的数据结构…

Spring底层核心原理解析

​ 本次分享会把Spring中核心知识点都给大家进行串讲&#xff0c;让大家对Spring的底层有一个整体的大致了解&#xff0c;比如&#xff1a; Bean的生命周期底层原理依赖注入底层原理初始化底层原理推断构造方法底层原理AOP底层原理Spring事务底层原理 但都只是大致流程&#…

11-天猫订单数据分析

前言 一、导入 import numpy as np import pandas as pd二、使用步骤 1.数据清洗 代码如下&#xff08;示例&#xff09;&#xff1a; data pd.read_excel(rC:\Users\B\Desktop\天猫订单.xlsx) data.head()data.info()data.describe(includeall)# 删除重复值 data.drop_du…

LeetCode653 两数之和 -输入二叉搜索树

探索二叉搜索树中的两数之和问题 在算法和数据结构的领域中&#xff0c;二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种非常重要的数据结构。它具有一些特殊的性质&#xff0c;使得我们可以高效地进行查找、插入和删除等操作。今天&#xff0c;我…

于交错的路径间:分支结构与逻辑判断的思维协奏

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节内容很多&#xff0c;文章字数达到了史无前例的一万一&#xff0c;我们要来学习分支与循环结构中…