42-Golang中的单元测试
Golang中的单元测试
- 需求
- 传统方法
- 基本介绍
- 单元测试快速入门总结
- 综合案例
需求
在工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确
传统方法
在main函数中,调用addUpper函数,看看实际输出的记过是否和预期的结果一直,如果一直,则说明函数正确否则函数有错误,然后修改错误
缺点:
- 1.不方便,我们需要在main函数中区调用,这样就需要去修改main函数,如果现在项目在运行,就可能去停止项目
- 2.不利于管理,因为我们测试多个函数或者多个模块时,都需要写在main函数,不利于我们管理和清晰思路
- 3.引出单元测试---->testing测试框架,可以很好解决问题
基本介绍
Go语言中自带有一个轻量级的测试框架testing和自带的 go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例(test case),也可以基于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题:
- 1.确保每个函数是可运行并且运行结果是正确的
- 2.确保写出来的代码性能是好的
- 3.当官测试能及时的发现程序设计或实现的逻辑错误,是问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计色很的一些问题,让程序能够在高并发的情况下还能保持稳定
cla.go包
package main//一个测试函数
func addUpper(n int) int {res := 0for i := 0; i <= n; i++ {res += i}return res}
cal_test.go包
package mainimport "testing" //引入go的testing框架包//编写一个测试用例,去测试addUpper是否正确
func TestAddUpper(t *testing.T) {//调用res := addUpper(10)if res != 55 {t.Fatalf("AddUpper(10)执行错误,期望值=%v 实际值=%v", 55, res)}//如果正确,输出日志t.Logf("AddUpper(10)执行正确")
}
/*
=== RUN TestAddUppercal_test.go:13: AddUpper(10)执行正确
--- PASS: TestAddUpper (0.00s)
PASS
*/

单元测试快速入门总结
- 1.测试用例文件名必须以_test.go结尾。比如cal_test.go,cal不是固定的
- 2.测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名,比如TestAddUpper
- 3.TestAddUpper(t *testing.T)的形参类型必须是 *testing.T
- 4.一个测试用例文件中,可以有多个测试用例函数,比如TestAddUpper, TestSub
- 5.运行测试用例指令
- cmd>go test[如果运行正确,无日志,错误时,会输出日志]
- cmd>go test -v [运行正确或者是错误,都输出日志]
- 6.当出现错误时候,可以使用t.Fatalf来格式化输出错误信息,并退出程序
- 7.t.Logf方法可以输出相应的日志
- 8.测试用例函数,并没有放在main函数中,也执行了,这就是测试用例的方便之处
- 9.PASS表示测试用例运行成功,FALL表示测试用例运行失败
- 10.测试单个文件一定要带上被测试的原文件 go test -v cal_test.go cal.go
- 11.测试单个方法 go test -v -test.run TestAddUpper
综合案例
- 1.编写一个Monster结构体,字段Name,Age,Skill
- 2.给MOnster绑定方法Store,可以将一个Monster变量(对象),序列化后保存到文件中
- 3.给Monster绑定方法ReStore,可以将一个序列化的Monster,从文件中读取,并反序列化为Monster对象,检测反序列化,名字是否正确
- 4.编程测试用例文件store_test.go,编写测试用例函数TestStore和TestRestore进行测试
//monster.go
package monsterimport ("encoding/json""fmt""io/ioutil"
)type Monster struct {Name stringAge intSkill string
}//给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:/monster.ser"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:/monster.ser"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
}//monster_test.go
package monsterimport "testing"//测试用例,测试store方法
func TestStore(t *testing.T) {monster := &Monster{Name: "kunkun",Age: 25,Skill: "rap",}res := monster.Store()if !res {t.Fatalf("monster.store() 错误,希望为=%v 实际为=%v", true, res)}t.Logf("monster.store()测试成功")}func TestMonster(t *testing.T) {//先创建一个monster实例,不需要指定字段的值var monster = &Monster{}res := monster.ReStore()if !res {t.Fatalf("monster.restore() 错误,希望为=%v 实际为=%v", true, res)}//进一步判断if monster.Name != "kunkun" {t.Fatalf("monster.restore() 错误,希望为=%v 实际为=%v", "kunkun", monster.Name)}t.Logf("monster.restore()测试成功")
}
/*
=== RUN TestStoremonster_test.go:16: monster.store()测试成功
--- PASS: TestStore (0.00s)
=== RUN TestMonstermonster_test.go:31: monster.restore()测试成功
--- PASS: TestMonster (0.00s)
PASS
*/
相关文章:
42-Golang中的单元测试
Golang中的单元测试需求传统方法基本介绍单元测试快速入门总结综合案例需求 在工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确 传统方法 在main函数中,调用addUpper函数,看看实际输出…...
python实现k_means聚类
K-Means算法是将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。簇中所有数据的均值通常被称为这个簇的“质心”(Centroids)。在一个二维平面中ÿ…...
【批处理脚本】-3.3-exit命令详解
"><--点击返回「批处理BAT从入门到精通」总目录--> 共3页精讲(列举了所有exit的用法,图文并茂,通俗易懂) 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中,经常会在其集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中,…...
如果读了我2011年求职前端开发的酸爽经历,希望你可以鼓起勇气继续向前
今年是2023年,如果你觉得今年找工作很难,狗哥回忆了一下2011年求职前端开发工作的酸爽经历,希望你读了以后可以鼓起勇气,不要迷茫,简历投出去石沉大海的,需要改简历的就赶紧改,刷题不到位的就赶…...
PTA:L1-016 查验身份证、L1-017 到底有多二、L1-018 大笨钟(C++)
目录 PTA:L1-016 查验身份证 问题描述: 实现代码: L1-017 到底有多二 问题描述: 实现代码: L1-018 大笨钟 问题描述: 实现代码: 都是简单模拟题,不再写题解。 PTA…...
springboot工厂模式解决if_else流程和问题点解决
一、主要问题点 spring中的Bean由IOC容器进行管理,和普通工厂的区别就是springboot中的类不能通过自己New出来使用,如果通过new写入到工厂,涉及到相关实现类调用其他Service(该service在正确情况下正常注入)ÿ…...
如何避免缓存击穿?使用GO语言实现sliglefight
前言 在缓存系统中,如果发生了缓存未命中,通常会向数据库或者其他的缓存系统来请求数据。 想象这样一种情况,缓存系统中某个热点值被删除了,随后一大批请求到来,造成大量的cache miss,如果这些请求全部都…...
【浅学Java】MySQL索引七连炮
MySQL索引面试七连炮0. 谈一下你对索引的理解1. MySQL索引原理和数据结构能介绍一下吗2. B树和B树的区别3. MySQL聚簇索引和非聚簇索引的区别4. 使用MySQL索引都有什么原则4.1 回表4.2 索引覆盖4.3 最左匹配4.4 索引下推5. 不同的存储引擎是如何进行数据的存储的6. MySQL组合索…...
扬帆优配|昔日白马股濒临退市,却6天5涨停!ST股突然集体爆发
尽管再度重申“公司股票将被停止上市”,但3月8日早间,*ST辅仁股价仍是在开盘后快速封住涨停板。这已是该公司近6个买卖日来,第5次呈现涨停。 无独有偶,8日早间ST东瀛也在此前多次涨停后,再度呈现近4%的涨幅。而就在7日…...
Git 基础(一)—— Git 的安装及其配置
目录 一、Git 的下载与安装 1、Linux 环境 2、Windows 环境 (1) 下载 Git 安装包 (2) 安装 Git 二、Git 配置 1、配置用户信息 2、查看配置信息 3、Windows 环境下配置文件的位置 一、Git 的下载与安装 1、Linux 环境 在保证网络环境畅通的情况下,直接输…...
什么是信息安全风险评估?企业如何做?
什么是信息安全风险评估? 信息安全风险评估是参照风险评估标准和管理规范,对信息系统的资产价值、潜在威胁、薄弱环节、已采取的防护措施等进行分析,判断安全事件发生的概率以及可能造成的损失,提出风险管理措施的过程。当风险评…...
HBase---idea操作Hbase数据库并且映射到Hive
idea操作Hbase数据库并且映射到Hive 文章目录idea操作Hbase数据库并且映射到Hiveidea操作Hbase数据库环境准备启动服务创建Maven工程在测试类中编写初始化方法在测试类中编写关闭方法在测试类中编写创建命名空间方法在测试类中编写创建表方法在测试类中编写查看表结构方法在测试…...
剑指 Offer 61 扑克牌中的顺子
摘要 扑克牌中的顺子 一、集合 Set 遍历 根据题意,此5张牌是顺子的 充分条件 如下: 除大小王外,所有牌 无重复 ;设此5张牌中最大的牌为max,最小的牌为min(大小王除外),则需满足…...
Spring 响应式编程-读书笔记
序言 大家好,我是比特桃。本文为《Spring 响应式编程》的读书笔记,响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点,同时响应式可以容忍网络延迟,并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速…...
CI流水线的理解
一、概念 单元测试:针对软件的基本单元(如:类、函数)所做的测试。 集成测试:将软件代码单元集成起来后,以组件、模块和子系统为单位进行的测试,主要测试接口间的交互关系。也称组件测试…...
OpenStack手动分布式部署Nova【Queens版】
目录 Nove简介: 1、登录数据库配置(在controller执行) 1.1登录数据库 1.2数据库里创建nova-api 1.3数据库登录授权 1.4创建nova用户 1.5添加admin用户为nova用户 1.6创建nova服务端点 1.7创建compute API 服务端点 1.8创建一个placement服务…...
centos7 oracle19c安装 ORA-01012: not logged on
总共分三步 1.下载安装包:里面有一份详细的安装教程 链接:https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码:8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…...
山东小巨人申报条件
国家专精特新小巨人特点1、经济效益:上年度企业营业收入在1亿元至4亿元之间,近2年主营业务收入或净利润的平均增长率达到10%以上,企业资产负债率不高于70%。2、专业化程度:(1)企业从事特定细分市场时间达到…...
手写中实现并学习ahooks——useRequest
前言 最近业务没有之前紧张了,也是消失了一段时间,也总结了一些之前业务上的问题。 和同事沟通也是发现普通的async await 封装api在复杂业务场景下针对于请求的业务逻辑比较多,也是推荐我去学习一波ahooks,由于问题起源于请求…...
[手写OS]动手实现一个OS 之 准备工作以及引导扇区
[手写OS]动手实现一个OS之第一步-环境以及引导扇区 环境准备 一台可用计算机(linux我不知道,我用的Windows)汇编编译器NASM一个方便的软盘读写工具VirtualBox 汇编编译器NASM 官网地址:https://www.nasm.us/pub/nasm/snapshot…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
