Go第 15 章 :单元测试

news2024/11/22 23:40:02

Go第 15 章 :单元测试

15.1 先看一个需求

在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确, 如:
请添加图片描述

15.2 传统的方法

15.2.1 传统的方式来进行测试

在 main 函数中,调用 addUpper 函数,看看实际输出的结果是否和预期的结果一致,如果一致, 则说明函数正确,否则函数有错误,然后修改错误
代码实现:
请添加图片描述

15.2.2 传统方法的缺点分析

  1. 不方便, 我们需要在 main 函数中去调用,这样就需要去修改 main 函数,如果现在项目正在运
    行,就可能去停止项目。
  2. 不利于管理,因为当我们测试多个函数或者多个模块时,都需要写在 main 函数,不利于我们管 理和清晰我们思路
  3. 引出单元测试。-> testing 测试框架 可以很好解决问题。

15.3 单元测试-基本介绍

Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命令来实现单元测试和性能测试,
testing 框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基 于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题:

  1. 确保每个函数是可运行,并且运行结果是正确的
  2. 确保写出来的代码性能是好的,
  3. 单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,
    而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定

15.4 单元测试-快速入门

使用 Go的单元测试,对 addUpper 和 sub 函数进行测试。
特别说明: 测试时,可能需要暂时退出 360。(因为 360 可能会认为生成的测试用例程序是木马)
演示如何进行单元测试:
请添加图片描述
请添加图片描述

15.4.1 单元测试快速入门总结

1)测试用例文件名必须以_test.go结尾。比如cal_test.go. ,cal 是不固定的
2)测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名,比如TestAddUpper
3)TestAddUpper(t testing.T) 的行参类型必须是tesing.T
(4)一个测试用例文件中,可以有多个测试用例函数,比如TestAddUpper、TestSub
(5)运行测试用例命令

  • 1 cmd>go test 【如过运行正确,无日志,错误时,会输出日志】
  • 2 cmd>go test -v 【运行正确或是错误,都输出日志】
    (6)当出现错误时候,可以使用t.Falatf来格式化输出错误信息,并退出程序
    (7)t.Logf方法可以输出相应的日志
    (8)测试用例函数,并没有放在main函数中,也执行不了,这就是测试用例的方便之处
  1. PASS 表示测试用例运行成功,FAIL 表示测试用例运行失败
  2. 测试单个文件,一定要带上被测试的原文件
    go test -v cal_test.go cal.go
  3. 测试单个方法
    go test -v -test.run TestAddUpper

15.5 单元测试-综合案例

请添加图片描述
代码实现:
monster/monster.go

package monster

import(
	"encoding/json"
	"io/ioutil"
	"fmt"
)

type Monster struct{
	Name string
	Age int
	Skill string
}
//给Monster绑定方法
func (this *Monster)Store()bool{
	//先序列化
	data,err:=json.Marshal(this)
	if err!=nil{
		fmt.Println("序列化失败err=",err)
		return false
	}

	//保存到文件
	filePath := "/Users/tianyi/Desktop/monster.ser"
	err=ioutil.WriteFile(filePath,data,0666)
	if err!=nil{
		fmt.Println("保存文件失败 err=",err)
		return false
	}
	return true
}

//给Monster对象绑定Load方法,可以将一个序列化的Monster从文件中读取,
//并反序列化为Monster对象,检查反序列化名字正确

func (this *Monster)ReStore()bool{
	//1、先从文件中,读取序列化的字符串
	filePath:="/Users/tianyi/Desktop/monster.ser"
	data,err:=ioutil.ReadFile(filePath)
	if err!=nil{
		fmt.Println("读取文件失败 err=",err)
		return false
	}
	//2、使用读取到的data []byte 进行反序列化
	err=json.Unmarshal(data,this)
	if err!=nil{
		fmt.Println("UnMarshal err=",err)
		return false
	}
	return true
}

monster/monster_test.go

package monster

import (
	"testing"
)


//测试用例,测试Store方法
func TestStore(t *testing.T){
	monster:=&Monster{
		Name:"红孩儿",
		Age:10,
		Skill:"吐火",
	}
	res:=monster.Store()
	if!res{
		t.Fatalf("monster.Store() 错误,希望为%v 实际为%v",true,res)
	}
	t.Logf("monster.Store()测试成功!")
}

func TestReStore(t *testing.T){
	var monster =&Monster{}
	res:=monster.ReStore()
	if !res{
		t.Fatalf("monster.ReStore() err,希望为%v 实际为%v",true,res)
	}
	t.Logf("monster.ReStore() 测试成功!")
	 //进一步判断
	 if monster.Name !="红孩儿"{
		 t.Fatalf("monster.ReStore() err 希望为%v,实际为%v","红孩儿",monster.Name)
	 }
	 t.Logf("monster.ReStore() 测试成功!")
}
  • 1、测试全部go test -v
  • 2、测试单个文件go test -v monster_test.go monster.go
  • 3、测试单个方法go test -v -test.run TestReStore

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s集群调度、亲和性、污点和容忍、pod状态、排障步骤

目录 一、调度约束 二、创建资源工作流程 三、Scheduler调度过程 1.Scheduler调度中考虑的问题 2.调度过程的步骤 3.预算策略(predicate)的常见算法 4.优选策略(priorities)的优先级 四、Pod 调度到指定Node节点 1.nodeNa…

微服务的服务拆分与远程调用

​ 哈喽大家好呀!好久不见甚是想念,给大家拜个年啦~应该不晚吧(ಥ_ಥ) 放假在家确实是容易躺平,有心而无力呀哈哈哈哈。但是闲着也是闲着,最近学了学微服务相关知识,马上也快毕业了就更到抓紧了 今天我来说说关于微服…

医疗影像容积重建-物体坐标系和渲染图像坐标系

1 物体坐标系(mm为单位,并三方向都是各向同性的情况)将所有数据的正中间(这里所有的数据,是指各体素按照实际位置在空间排列),作为物体坐标系的原点,以图像的image orientation X方向&#xff0…

Android开机动画

1.动画的位置 android开机动画位置在/system/media目录下,/system/media/bootanimation.zip 解压是如下的文件内容 part0,part1,part2存放的都是要播放开机动画的帧图片,desc.txt写的是播放方式,desc文件内容类似如下…

天云数据Hubble数据库荣获2022年度IT168技术卓越奖

在2022年即将结束之际,IT168再次启动“技术卓越奖”评选。由行业CIO/CTO大咖、技术专家及IT媒体三方联合评选,评判标准代表了用户和媒体声音。经过多方评审,天云数据Hubble数据库荣获2022年度IT168技术卓越奖。 IT168主编任朝阳说&#xff1a…

SAP FICO 内部订单详细解析

内部订单 内部订单是用来对企业内部某项工作或者任务编制计划、归集成本、结算的载体。比如市场推广活动、内部团队活动、研发项目、投资项目、在建工程项目等。 内部订单需要区别于销售订单、采购订单和生产订单。 销售订单和采购订单是企业与外部单位以合同或者契约为纽带&…

Socket缓冲区,可读可写条件

一 socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区&…

从0到0.1学习 maven(一:概述及简单入门)

文章目录概述从没用的有趣小知识开始Maven是什么?为什么用Maven?使用与配置入门目录结构编写pom使用Archetype生成骨架小彩蛋:直接运行包含main的jar概述 从没用的有趣小知识开始 Maven可以翻译成“知识的累积”,“专家/行家”。…

数据质量管理深入浅出

质量是生活中最常关注的话题,我们都期望享用高质量的商品与服务,且企业也不断加大质量管理的投入,为了更好的用户体验。 在企业数字化转型浪潮下,传统手段已无法应对数字化转型中的数据质量管理需求,我们需要探索出一条…

千万级数据,如何做性能优化?分库分表、Oracle分区表?

目录一、Oracle是如何存储数据的?1、逻辑存储与物理存储2、进一步分析它们之间的关系3、Oracle逻辑数据块(1)块头(2)行数据(3)可用空间(4)致块头增长的原因有&#xff1a…

关于我给dumi2.0提pr的完整记

前言 博主最近一年时间在工作业余都在写开源组件库 concis ,其中文档站点生成框架采取了 dumi,前几天不久dumi2.0正式发布,博主也是顺势而为直接把项目升级(dumi1 -> dumi2) 由于dumi2 的站点设计比原来好看太多了…

备忘:收藏栏式的主页

作为从DOS时代过来的骨灰,早期的 Window 出于各种原因需要重装,而重装之后IE的收藏夹全丢了(不可能每次重装之前备份了收藏夹)。所以编程把收藏夹提取出来(当时就是目录结构下的 .lnk 文本内容)转为 myfav.html 作为主页,(不备份目录是为了)方…

eclipse快捷键

Eclipse常用快捷键1几个最重要的快捷键代码助手:CtrlSpace(简体中文操作系统是Alt/)快速修正:Ctrl1单词补全:Alt/打开外部Java文档:ShiftF2显示搜索对话框:CtrlH快速Outline:CtrlO打开资源&…

python时间-time模块

time是python自带的模块,用于处理时间问题,提供了一系列的操作时间的函数。 以下说明针对于 python2.7,其他版本可能有所差异。 模块提供了两个种表示时间的格式: 1.时间戳,是以秒表示从“新纪元”到现在的时间&#x…

代码随想录训练营第16天|104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

104 二叉树的最大深度 看完题后的思路 后续遍历 深度 f(root)终止条件 rootnull return 0递归 if rootnullreturn 0; leftf(root.left); rightf(root.right); return max(left,right)1;思路 节点深度: 该节点到根节点的节点数,某个节点的深度一次就能求出来 节点高度:该节点…

爱因斯坦求和约定:torch/np.enisum

结论:爱因斯坦求和约定就是用来省略求和符号的;所以它的本质是求和运算,它并不能决定具体的运算到底是矩阵乘法,还是内积外积之类的,它所涉及的所谓的矩阵乘法之类的,其实是人为定义的,和它自身…

Java 并发编程(Ⅰ)

目录1. 概念1. 基本概念2. 线程的状态2. 线程的初始化1. new Thread()2. new Thread(new Runnable())3. Thread 和 Runnable 的关系4. new Thread(new FutureTask(new Callable()))3. 常用方法1. start1. 线程组2. start 和 run2. sleep1. TimeUtil2. InterruptedException3. s…

DCMM数据管理能力成熟度认证详解

第一部分:评估基础篇 First part DCMM定义 DCMM是《数据管理能力成熟度评估模型》GB/T 36073-2018国家标准,英文简称:(Data management Capability Maturity Model)。是我国首个数据管理领域正式发布的国家标准。旨在帮…

【ZooKeeper】

1.ZooKeeper是什么? 答: ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户…

100 家企业软件测试笔试面试题汇总(网友真实面试后征集)

目录 一、中科软 二、AURALOG 笔试面试(外企) 三、GWebs 公司笔试题 四、北京麒麟网信息技术有限公司笔试题 五、施惠特 六、总结 一、中科软 笔试题 1.谈谈你对测试的理解2.你三年的职业规划3.你对加班的看法?是否可以加班?4.你心…