GO/testing包

前言

之前在写GO单元测试的时候, 使用了这个结构testing.T. 进来无事翻了翻, 发现testing包中还有一些其他的结构体, 想来是不同用处. 没想到GOtesting包竟然默默做了这么多支持, 之前竟然不知道.

testing包中包含一下结构体:

  • testing.T: 这就是我们平常使用的单元测试
  • testing.F: 模糊测试, 可以自动生成测试用例
  • testing.B: 基准测试. 对函数的运行时间进行统计.
  • testing.M: 测试的钩子函数, 可预置测试前后的操作.
  • testing.PB: 测试时并行执行.

依次对GO的各个测试类型进行介绍.

以下各项测试中出现的方法Reverse如下:

// 此方法源自 Go 官方文档
func Reverse(s string) string {bs := []byte(s)length := len(bs)for i := 0; i < length/2; i++ {bs[i], bs[length-i-1] = bs[length-i-1], bs[i]}return string(bs)
}

testing.T

用于进行单元测试. 官方文档

Go对单元测试函数要求如下:

  1. 文件名形如: xxx_test.go
  2. 函数签名形如: func TestXxx(t *testing.T)

我们创建文件lib_test.go, 并在其中定义如下方法:

func TestReverse(t *testing.T) {str := "abc"revStr1 := Reverse(str)revStr2 := Reverse(revStr1)if str != revStr2 {// error 方法报错后, 会继续向下执行t.Error("error")// fatal 方法报错后, 会退出测试// t.Fatal("fatal")// 输出调试信息// t.Log("log")// 测试中断, 但是测试结果不会十遍// t.Skip("skip")}// 可启动多个子测试, 子测试之间并行运行for _, str = range []string{"abcd", "aceb"} {// 第一个参数为子测试的标识t.Run(str, func(t *testing.T) {revStr1 := Reverse(str)revStr2 := Reverse(revStr1)if str != revStr2 {t.Error("error")}})}
}

使用如下命令运行测试用例(test.run 指定运行某一个函数):

go test -test.run TestReverse

这就是单元测试的简单应用了, 是不是so easy啦.

testing.F

用于模糊测试, 会自动生成测试用例. 官方文档

其内部会自动生成各种测试用例, 并自动调用执行. Go对模糊测试的函数要求如下:

  1. 文件名形如: xxx_test.go
  2. 函数签名形如: func FuzzXxx(f *testing.F)

其测试函数定义如下:

func FuzzReverse(f *testing.F) {// 设置测试用例需要随机生成的变量类型f.Add("Hello, world!")// 生成测试用例并进行测试. 回电函数接收的参数, 与 f.Add 设置的参数类型一致f.Fuzz(func(t *testing.T, str string) {revStr1 := Reverse(str)revStr2 := Reverse(revStr1)if revStr2 != str {t.Error("error")}// 判断是否是合法的 utf8 编码if utf8.ValidString(str) && !utf8.ValidString(revStr1) {t.Error("utf8 error")}})
}

运行命令开始测试: go test -test.fuzz FuzzReverse -test.run ^$ (其中test.run指定不运行test函数)

image-20220528091719962

当测试失败的时候, 失败的用力会写入指定的文件, 文件在控制台输出.

testing.B

用于基准测试. 对函数的运行时间进行统计. , 对函数要求如下:

  1. 文件名形如: xxx_test.go
  2. 函数签名形如: func BenchmarkXxx(b *testing.B)

函数定义如下:

func BenchmarkReverse(b *testing.B) {// 打开内存统计b.ReportAllocs()// 按照要求运行 n 遍for i := 0; i < b.N; i++ {Reverse("hello")}
}

运行命令: go test -test.bench BenchmarkReverse -test.run ^$

image-20220528100115791

结果中指出了运行次数及平均时间. 其中各项值得含义如下:

  • 100000000: 迭代次数

  • ns/op: 平均每次迭代消耗的时间

  • B/op: 平均每次迭代消耗的内存

  • allocs/op: 平均每次迭代内存的分配次数

testing.M

定义在运行测试的前后执行的操作. 对函数的要求如下:

  1. 文件名形如: xxx_test.go
  2. 函数签名为: func TestMain(m *testing.M)

函数定义如下:

func TestMain(m *testing.M) {// 测试之前执行的操作fmt.Println("starting test main")// 运行测试code := m.Run()// 测试之后执行的操作fmt.Println("ending test main")os.Exit(code)
}

此函数会在运行所有测试时自动调用.

testing.PB

用于在测试时进行并发测试. 上面的 单元测试/模糊测试/基准测试 都可以使用. 以基准测试为例, 使用如下:

// 充分利用 CPU 资源, 并行执行 n 次
func BenchmarkReverse2(b *testing.B) {b.RunParallel(func(pb *testing.PB) {for pb.Next() {// 此循环体总共执行 b.N 次Reverse("hello")}})
}

如此便可并行执行啦.


好, 有关Go的单元测试, 到这里就差不多了. 以上这些已经基本能够满足日常使用了

原文链接: https://hujingnb.com/archives/798

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

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

相关文章

CPU的分支预测

前言 最近在进行性能调优的时候, 碰到了这样的一段代码(为了展示问题而简化的代码): <?php // 第一次运行 $start microtime(true); for ($i 0; $i < 100; $i) {for ($j 0; $j <1000; $j) {for ($k 0;$k < 10000; $k) {}} } $end microtime(true); echo fi…

Golang Context 简介

前言 在写Golang程序调用各种第三方库的时候, 经常会传一个叫做Context的参数. 之前基本上见到接Context, 根本不管是干什么用的, 直接无脑context.Background(). 但是, 传着传着就不免发生一些小疑问, 这个参数到底是干什么用的呢? 这么多库都在使用, 至少说明其是Golang中…

PHP获取Opcode及C源码

是什么 在开始之前, 必须要先介绍一下Opcode是什么. 众所周知, Java在执行的时候, 会将.java后缀的文件预先编译为.class字节码文件, JVM加载字节码文件进行解释执行. 而字节码文件存在的意义, 就是为了加速执行. 那么PHP的Opcode与之类似, 也是从.php文件到执行的过程中, 所…

PHP require/include 区别

前言 在PHP中, 载入文件可以选择使用require, 也可以使用include, 那么那他们有什么区别呢? 看了网上的一些文章, 说他们使用场景不同, require一般在文件开头引入文件, include一般在函数中动态引入文件. 但是我觉得并不是这么简单, require是作为语言结构(关键字)出现的, …

RESTful API规范

前言 我现在工作的公司是在毕业前实习的公司, 实习结束后直接转正, 因此也是我任职过的唯一一家公司. 在日常工作进行 HTTP 接口的开发时, 发现了一个疑惑, 只用到了POST和GET请求, 但我们知道 HTTP还有PUT/DELETE等等, 为什么不用呢? 并且, 接口的响应码也只有200, 接口是…

Golang 接口原理

问题 小提示, 若想直接查看原理, 可从接口原理开始查看. 有这样一段GO代码: func main() {var obj interface{}fmt.Printf("obj nil. %b\n", obj nil)type st struct{}var s *stobj sfmt.Printf("s nil. %b\n", s nil)fmt.Printf("obj nil. …

Docker kill 1无效

前言 我们在平常强制停用一个进程的时候, 会选择什么命令? 一般在测试使, 不考虑程序突然中断带来的影响, 直接使用kill -9 pid强制停止就行. 但是, 就在刚刚, 我启动了一个docker容器, 进入容器后执行命令kill -9 1没有任何效果??? 啊这, 为什么呀? 尝试 为了解释这个…

容器内存相关知识

这篇文章是我研究容器内存整理出的相关内容. 前后内容并没有上下文关系, 每个知识点都可以单独查看. 内存控制 使用这样的命令启动一个容器docker run -d -m 300M xxx. 可以限制容器使用的内存最大为300M. 那么docker是如何实现容器的内存限制呢? 其实是操作系统已经做好了…

三星识别文字_比亚迪电子助力三星Galaxy Note 10系列霸气首发!

三星有子初长成气宇轩昂 秀美俊逸减之一分则嫌柔增之一分则嫌赘2019年8月7日于纽约巴克莱发布Galaxy Note 10系列用简约 重构美三星Galaxy Note 10与Galaxy Note 10分别搭载了6.3英寸和6.8英寸的超感官全视曲面屏&#xff0c;均采用单摄挖孔屏&#xff0c;开孔位于屏幕正上方。…

lisp 设计盘形齿轮铣刀_机械设计基础——周转轮系传动比的计算

点击上方蓝色字体&#xff0c;关注我们15(视频来源于网络&#xff0c;仅供学习交流&#xff0c;侵权请联系删除)机械计重点学习指导机械原理全书重点提要轴的结构改错机械设计作业集01机械设计作业集02机械设计作业集答案机械原理作业集机械原理作业集答案轴的强度计算院校推荐…

b+树阶怎么确定_B站公布年度弹幕,这个排名我不太服气

也忘记了是从什么时候开始&#xff0c;B站开始公布自己的年度弹幕了&#xff0c;今年的年度弹幕排名前五的分别是&#xff1a;爷青回、武汉加油、有内味了、双厨狂喜、禁止套娃。话说今年真的是不容易啊&#xff0c;过年那段时间以及上半年不会忘记那一幕幕感人深邃的瞬间&…

css打印适应纸张_从生态平衡到打印机故障分析

生态平衡(ecological equilibrium)是指在一定时间内生态系统中的生物和环境之间、生物各个种群之间&#xff0c;通过能量流动、物质循环和信息传递&#xff0c;使它们相互之间达到高度适应、协调和统一的状态。也就是说当生态系统处于平衡状态时&#xff0c;系统内各组成成分之…

html5调用系统声音1s响一次_20款奔驰GLC260提车改柏林之声音响,音乐诉请,为爱发声!...

奔驰GLC车型在2020上半年可谓是风生水起&#xff0c;尤其是2020年1-5月份的豪华品牌SUV排名中&#xff0c;奔驰GLC车型以58982的销售量遥遥领先&#xff0c;同比增长了2%&#xff0c;奔驰GLC5月销量高达15275辆&#xff0c;再次打败老对手奥迪Q5L&#xff0c;夺得豪华SUV销量冠…

js排序的时间复杂度_冒泡排序最好时间复杂度为什么是O

展开全部冒泡排序的基本思想是&#xff0c;对相邻的元素进行两两比较&#xff0c;顺序相反则进行交换&#xff0c;这样&#xff0c;每一趟会e68a8462616964757a686964616f31333433616161将最小或最大的元素“浮”到顶端&#xff0c;最终达到完全有序代码实现在冒泡排序的过程中…

kotlin将对象转换为map_将网站转换为Photoshop文档

WebToLayers是一款能够帮助大家将网页转换成图像格式的软件&#xff0c;能够Web页面转换成PNG&#xff0c;JPG以及PSD格式的图片。当网页转换为PSD的时候&#xff0c;网页的各个要素都会自动转换为相应的图层&#xff0c;使得大家能够对PSD格式的网页进行设计与管理。WebToLaye…

centos更换网卡后怎么更新配置_CentOS安装

服务器使用的Linux操作系统都使用了CentOS来进行安装&#xff0c;CentOS是一个开源的Linux发行版&#xff0c;具有很好的稳定性和更多的可扩展行。为了能够正常使用Docker&#xff0c;我们将使用CentOS7及以上版本。​下载地址&#xff1a;https://www.centos.org/download/ ​…

串口485接法图_rs485接口接线怎样操作?

展开全部RS485采用差分62616964757a686964616fe58685e5aeb931333365633939信号负逻辑&#xff0c;2V&#xff5e;6V表示“0”&#xff0c;- 6V&#xff5e;- 2V表示“1”。RS485有两线制和四线制两种接线&#xff0c;四线制是全双工通讯方式&#xff0c;两线制是半双工通讯方式…

centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权

刚收到在腾讯云申请的云服务器8台&#xff0c;现在准备分配给不同项目组来使用。为了确保系统及账号的安全&#xff0c;root账号不能直接给到他们。因为root的权限太大&#xff0c;任何的误操作就可能导致系统异常或者数据丢失找不回来。而且我们这是生产环境&#xff0c;账号会…

mongodb 导出txt_(干货)前端实现导出excel的功能

前言 导出功能其实在开发过程中是很常见的,平时我们做导出功能的时候基本都是后台生成&#xff0c;我们直接只需要调一支接口后台把生成的文件放到服务器或者数据库mongodb中,如果是放到mongodb中的话,我们需要从mongodb中通过唯一生成的id去拿到文件,最后window.location.href…

1971旗舰cpu intel_CPU的历史

很多人都对电脑硬件有一点的了解&#xff0c;本人也算略懂一二&#xff0c;所以今天来为大家说说电脑的主要硬件之一––CPU(中央处理器)。那么我们知道世界上造CPU的公司主要就是Intel和AMD。其实仔细想想&#xff0c;CPU的主要成分是什么?是硅(Si)&#xff0c;硅从那里来&am…