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…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...