关于go语言的测试相关内容笔记
其实之前对于测试自己一直比较弱,不管是python的还是go的,关于测试这块并没有非常注重,这次就好好整理一下关于go的测试
单元测试
Go程序主要包含三类测试: 功能测试(test)、基准测试(benchmark,也称性能测试)以及示例测试
这里提一下,示例测试其实也是一种功能测试,只不过它更关注程序打印出来的内容
一般情况下:一个测试赛源码文件只会针对某个命令源码文件, 或库源码文件做测试,所以我们应该把它们放在同一个代码包内
测试源码文件的主名称应该以被测试源码文件的主名称为前导, 并且必须以“_test”为后缀,如被测试的源码文件名是demo.go 那么测试源码文件名是demo_test.go
Go 语言对测试函数的名称和签名都有哪些规定?
- 对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只有一个*testing.T 类型的参数声明
- 对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是*testing.B类型
- 对于实例测试函数来说,其名称必须以Example为前缀, 但对函数的参数列表没有强制规
关于go test 命令的主要流程是:
go test 命令在开始运行时会先做一些准备工作,比如,确定内部需要用到的命令,检查我们指定的代码包或源码文件的有效性,以及判断我们基于的标记是否合法等等
在准备工作完成后,go test 命令会针对每个测试代码包依次进行构建,执行包中符合要求的测试函数,清理临时文件,打印测试结果。
这里的依次:表示对每个测试代码包,go test 命令会串行的执行测试流程中的每个步骤。但是为了加快测试速度,它通常会并发地对多个被测试代码包进行功能测试。只不过最后打印测试结果的时候
会按照我们给定的顺序逐个进行,让我们感觉是在串行的执行测试
由于并发测试会让性能测试的结果存在偏差,所以性能测试一般都是串行进行的
go test -v 可以看到测试中更详细的日志信息
如果想要某个测试在执行的过程中立即失败,可以在该函数中调用:t.FailNow方法
怎么解释性能测试的测试结果?
这个还是非常重要的,之前并没有去细致的了解
这里有一段代码,并为之写了一个性能测试代码内容如下:
package demo54 import "math" func GetPrimes(max int) []int {
if max <= {
return []int{}
}
marks := make([]bool, max)
var count int
squareRoot := int(math.Sqrt(float64(max)))
for i := ; i <= squareRoot; i++ {
if marks[i] == false {
for j := i * i; j < max; j += i {
if marks[j] == false {
marks[j] = true
count++
}
}
}
}
primes := make([]int, , max-count)
for i := ; i < max; i++ {
if marks[i] == false {
primes = append(primes, i)
}
}
return primes
}
性能测试的代码为:
package demo54 import "testing" func BenchmarkGetPrimes(b *testing.B) {
for i:=;i<b.N;i ++ {
GetPrimes()
}
}
下面是测试命令和结果
zhaofan@zhaofandeMacBook-Pro ~/go_project go test -bench=. -run=^$ /demo54
goos: darwin
goarch: amd64
pkg: /demo54
BenchmarkGetPrimes- ns/op
PASS
ok /demo54 .407s
这里对这个命令进行解释:
第一个标记-bench=. 只有有了这个标记命令才会进行性能测试,该标记. 表明需要执行任意名称的性能测试函数,当然这里还是要符合Go程序测试的基本规则的
第二个标记及值是-run=^$ 这个标记用于表明需要执行哪些功能测试函数,这同样是以函数名称为依据的 该标记的值^$ 意味着只执行名称为空的功能测试函数,其实就是不执行任何功能测试函数
结果中:BenchmarkGetPrimes-4 被称为单个性能测试的名称,表示命令执行了性能测试函数BenchmarkGetPrimes 并且当时所有最大的P 数量为4 最大P 数量相当于可以同时运行goroutine的逻辑CPU的最大个数。这里的CPU可以被称为CPU核心,但他并等同于计算机中真正的CPU核心
go test -cpu 可以设置最大P数量的列表
关于测试代码的解释:
func BenchmarkGetPrimes(b *testing.B) {
for i:=;i<b.N;i ++ {
GetPrimes()
}
}
这里在一个会循环迭代b.N次方的循环中调用了GetPrimes函数,并传递的参数为1000, go test 命令会先尝试把b.N 设置为1,
然后执行测试函数
如果测试的函数执行时间没有超过上限, 此伤心啊默认为1秒,那么命令就会改大b.N的值,然后再次执行测试函数,如此往复,知道这个时间大于或等于上限为止。
当某次执行的时间大于或等于上限时, 我们就说这事命令此次对该测试函数的最后一次执行,这时b.N的值就会包含在测试结果中,也就是上述测试结果中的500000
结果中:2728 ns/op 表明单次执行GetPrimes函数的平均耗时为2728纳秒。 这其实就是最后一次执行测试函数的时间,除以被测函数的执行测试得出的结果
关于go语言的测试相关内容笔记的更多相关文章
- Web测试相关内容
Q-1. Web测试的范围是什么? 答. Web测试是软件测试的名称,专注于测试基于Web的应用程序. 在进入生产环境之前,测试团队会对Web应用程序进行详尽的测试. 这有助于发现应用程序中的不同问题 ...
- JDBC mysql 相关内容笔记
解决乱码: url字符串加上?useUnicode=true&characterEncoding=utf-8; mysql数据库无法插入中文数据问题:将mysql数据库的编码改为utf-8; ...
- 【Android端】【日志收集上报SDK相关内容测试的方案梳理总结】
测试方案: 主要从几个方面关注,功能 性能 服务端策略(目前所有的这些上报收集等都会通过开关的精细化,通过接口方式将信息返回给APP端,APP端根据相关内容进行上报,因此基于此的上报机制及收集机制都需 ...
- Django模板语言相关内容 Djan
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- Django——模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- Hibernate5笔记8--Hibernate事务相关内容
Hibernate事务相关内容: (1) 事务四大特性(简称ACID): (1)原子性(Atomicity) 事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行. (2)一致性(Con ...
- 使用TestFlight测试时候相关内容
前言:记录一下使用TestFlight测试时候相关内容 场景:在我们添加测试员:给测试员发送了邀请:测试员使用TestFlight的时候,其实是有崩溃的次数的记录的,相应的崩溃的信息也是可以查询到的. ...
- 6月15日 python学习总结 Django模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- 学习笔记之html5相关内容
写一下昨天学习的html5的相关内容,首先谈下初次接触html5的感受.以前总是听说html5是如何的强大,如何的将要改变世界.总是充满了神秘感.首先来谈一下我接触的第一个属性是 input的里面的 ...
随机推荐
- Oracle date-time
Name Description ADDDATE() Add time values (intervals) to a date value ADDTIME() Add time CONVERT_TZ ...
- Python爬虫:更加优雅的执行JavaScript(PyV8)
https://www.jianshu.com/p/c534d6eb881a?utm_source=oschina-app
- 理解JSON对象:JSON.parse、 JSON.stringify
何时是JSON,何时不是JSON? JSON就是一个有特殊规则的字符串,按照这个规则我们就可以把这个字符串解析成JS对象. JSON是设计成描述数据交换格式的,他也有自己的语法,这个语法是JavaSc ...
- ES6基础语法
1. 什么是ECMAScript ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association ...
- 最小树形图——朱刘算法(Edmonds)
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...
- HTML 标题标签
HTML:超文本标记语言基本结构 <!DOCTYPE html> <!--文档的声明 一个HTML文件就是一个文档 --> <html lang="en&quo ...
- windows下安装Mysql—图文详解
mysql安装过程及注意事项: 1.1. 下载: 我下载的是64位系统的zip包: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip的包: 下载后解压 ...
- CodeForces 456-C Boredom
题目链接:CodeForces -456C Description Alex doesn't like boredom. That's why whenever he gets bored, he c ...
- 小甲鱼Python第十三讲课后题--014字符串
字符串的方法及注释 capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) ...
- Tips_方格拼图效果
用原生的javascript实现方格拼图效果 1.新建文件夹 代码如下: 01.html <!DOCTYPE html> <html lang="en"> ...