博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang单元测试与基准测试
阅读量:3986 次
发布时间:2019-05-24

本文共 2561 字,大约阅读时间需要 8 分钟。

注意:在Golang中,对于单元测试程序来说通常会有一些重要约束,主要如下:

1、单元测试文件名必须为xxx_test.go
2、单元测试的函数名必须为TestXxx(大驼峰)
3、单元测试函数参数必须为t *testing.T(测试框架强要求)
4、基准测试也要放在xxx_test.go文件里面,以BenchmarkXxxx(大驼峰)为文件名,参数为 b *testing.B

xxx_test.go 文件可以放在任何地方,测试的时候进入该目录再运行。

在实际使用中,避免不了要去测试一些功能,而它又牵涉到项目的初始化操作,尤其是加载配置文件,这就决定了测试源码文件和命令源码文件放在同个地方。

// 单元测试func TestLock(t *testing.T) {
...}// 基准测试func BenchmarkLock(b *testing.B) {
...}

进入要测试的目录

cd tests

1、运行单元测试

相关命令

go help test

运行测试,只输出失败的单元测试用例信息

go test

对当前目录下的全部单元测试程序进行运行测试(也就是所有的xxx_test.go文件中的所有function都会运行)

运行测试,输出详细的单元测试结果

go test -v

运行测试,运行匹配的函数,注意此处会全部运行名称为 functionnamexxx的函数

go test -v -run functionnamego test -v -test.run functionname

2、运行基准测试

go test -v -bench=.

运行所有的单元测试和基准测试

-bench可以指定函数名,支持正则

go test -v -bench=. -benchmem

-benchmem 输出每次运行分配内存的次数和字节数

-benchtime="3s" 设置每次运行的时间上线

go test -v -run="none" -bench=. -benchmemgo test -v -run=^$ -bench=. -benchmem

不运行单元测试,只运行所有的基准测试

基准测试结果说明

BenchmarkLock-8                1        1378545000 ns/op          228240 B/op       1194 allocs/op1、BenchmarkLock-8 表示当前系统有8个逻辑CPU2、1 表示运行了1次3、nx/op 表示每次运行耗时,纳秒4、B/op 表示每次运行使用了内存的字节数5、allocs/op 表示每次运行分配内存的次数

性能测试函数计时器:

当性能测试函数中有一些额外的初始化操作时,可以通过启停计时器来屏蔽这些操作对最终性能测试的影响

效果比较

go test -v -bench=. -run=^$ -benchmem
func BenchmarkLock(b *testing.B) {
b.StopTimer() time.Sleep(time.Second * 1) b.StartTimer() a := 0 for i := 0; i < b.N; i++ {
a++ }}
goos: linuxgoarch: amd64pkg: voteapiBenchmarkLockBenchmarkLock-8         1000000000               0.373 ns/op           0 B/op          0 allocs/opPASSok      voteapi 6.942s
func BenchmarkLock(b *testing.B) {
time.Sleep(time.Second * 1) a := 0 for i := 0; i < b.N; i++ {
a++ }}
goos: linuxgoarch: amd64pkg: voteapiBenchmarkLockBenchmarkLock-8                1        1000116000 ns/op             104 B/op          3 allocs/opPASSok      voteapi 1.538s

对于 b.N 参数而言, test 命令先会尝试设置为1,之后执行函数。如果测试函数没有达到执行上限的话, test 函数会增大,之后再次执行测试函数,如此往复,直到执行时间大于或者等于上限时间为止。 上限时间可以使用 -benchtime设定

几个常用的参数	-args: 							指定一些测试时的参数(可以指定超时时间,cpu绑定,压测等等(go test包含单元测试,压力测试等))	-test.v: 						是否输出全部的单元测试用例(不管成功或者失败),默认没有加上,所以只输出失败的单元测试用例	-test.run pattern: 				只跑哪些单元测试用例	-test.bench patten: 			只跑那些性能测试用例	-test.benchmem : 				是否在性能测试的时候输出内存情况	-test.benchtime t : 			性能测试运行的时间,默认是1s	-test.cpuprofile cpu.out : 		是否输出cpu性能分析文件	-test.memprofile mem.out : 		是否输出内存性能分析文件	-test.blockprofile block.out : 	是否输出内部goroutine阻塞的性能分析文件	-c: 							编译测试文件到pkg.test,但是不会运行测试程序	-exec xprog: 					使用xprog参数来运行编译的测试文件(参数类似go run后的参数)	-i: 							安装测试程序中的依赖包,但是不运行测试程序	-json: 							以json格式输出测试结果	-o file: 						指定测试程序编译后生成的文件名

转载地址:http://hdaui.baihongyu.com/

你可能感兴趣的文章
Web Server与App Server
查看>>
java8函数式编程(2)
查看>>
MarkdownPad2.5/2 注册码
查看>>
Java8系列之重新认识HashMap
查看>>
[转]Java中的多线程你只要看这一篇就够了
查看>>
Thinking in java(八)
查看>>
XML文件处理过程中的0x1A 错误处理
查看>>
数组是否包含某个元素
查看>>
[转]分布式之消息队列复习精讲
查看>>
[转]分布式之redis复习精讲
查看>>
设计模式-单例模式
查看>>
[转]Java泛型详解
查看>>
Eclipse pyDev环境搭建
查看>>
排序算法(2)-冒泡排序及优化
查看>>
[并发]synchronized与volatile
查看>>
[转]String 之 new String()和 intern()方法深入分析
查看>>
java中Object类 源代码详解
查看>>
I/O模型
查看>>
javap与 i++,++i
查看>>
自定义类加载器
查看>>