golang测试

Go 程序编写三类测试,即:功能测试(test)、基准测试(benchmark,也称性
能测试),以及示例测试(example)。

  • 测试源码文件的主名称应该以被测源码文件的主名称为前导,并且必须以“_test”为后缀。
  • 对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只应有一个*testing.T类型的参数声明。
  • 对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是*testing.B类型的。
  • 对于示例测试函数来说,其名称必须以Example为前缀,但对函数的参数列表没有强制规定

功能测试

1,测试单个文件,一定要带上被测试的原文件

go test -v  wechat_test.go wechat.go 

2,测试单个方法

go test -v -test.run TestRefreshAccessToken

基准测试

$ go test -bench=. -run=^$ puzzlers/article20/q3
goos: darwin
goarch: amd64
pkg: puzzlers/article20/q3
BenchmarkGetPrimes-8 500000 2314 ns/op
PASS
ok puzzlers/article20/q3 1.192s

解析

  • 第一个标记及其值为-bench=.,只有有了这个
    标记,命令才会进行性能测试。该标记的值.表明需要执行任意名称的性能测试函数。

  • 第二个标记及其值是-run=^ $ ,这个标记用于表明需要执行哪些功能测试函数,这同样也是以函数名称为依据的。该标记的值^$意味着:只执行名称为空的功能测试函数,换句话说,不执行任何功能测试函数。你可能已经看出来了,这两个标记的值都是正则表达式。实际上,它们只能以正则表达式为值。
    此外,如果运行go test命令的时候不加-run标记,那么就会使它执行被测代码包中的所有功能测试函数。

  • 再来看测试结果,重点说一下倒数第三行的内容。BenchmarkGetPrimes-8被称为单个性能测试的名称,它表示命令执行了性能测试函数BenchmarkGetPrimes,并且当时所用的最大P 数量为8。

  • 最大 P 数量相当于可以同时运行 goroutine 的逻辑 CPU 的最大个数。这里的逻辑 CPU,也可以被称为 CPU 核心,但它并不等同于计算机中真正的 CPU 核心,只是 Go 语言运行时系统内部的一个概念,代表着它同时运行 goroutine 的能力。

  • 顺便说一句,一台计算机的 CPU 核心的个数,意味着它能在同一时刻执行多少条程序指令,代表着它并行处理程序指令的能力。我们可以通过调用 runtime.GOMAXPROCS函数改变最大 P 数量,也可以在运行go test命
    令时,加入标记-cpu来设置一个最大 P 数量的列表,以供命令在多次测试时使用。

  • 在性能测试名称右边的是,go test命令最后一次执行性能测试函数(即
    BenchmarkGetPrimes函数)的时候,被测函数(即GetPrimes函数)被执行的实际次数。这是什么意思呢?

  • go test命令在执行性能测试函数的时候会给它一个正整数,若该测试函数的唯一参数的名称为b,则该正整数就由b.N代表。我们应该在测试函数中配合着编写代码,比如:
    我在一个会迭代b.N次的循环中调用了GetPrimes函数,并给予它参数值1000。go test命令会先尝试把b.N设置为1,然后执行测试函数。如果测试函数的执行时间没有超过上限,此上限默认为 1 秒,那么命令就会改大b.N的值,然后再次执行测试函数,如此往复,直到这个时间大于或等于上限为止。当某次执行的时间大于或等于上限时,我们就说这是命令此次对该测试函数的最后一次执行。这时的b.N的值就会被包含在测试结果中,也就是上述测试结果中的500000。

  • 我们可以简称该值为执行次数,但要注意,它指的是被测函数的执行次数,而不是性能测试函数的执行次数。

  • 最后再看这个执行次数的右边,2314 ns/op表明单次执行GetPrimes函数的平均耗时为2314纳秒。这其实就是通过将最后一次执行测试函数时的执行时间,除以(被测函数的)执行次数而得出的。

F:\Development\Go\src\otherPractice\go36\tests>go test -v -bench=. -benchtime=3s -benchmem -run=none
goos: windows
goarch: amd64
pkg: otherPractice/go36/tests
BenchmarkMap-4              3000           1347727 ns/op          687122 B/op        275 allocs/op
BenchmarkMapCap-4          10000            641282 ns/op          322236 B/op         11 allocs/op
PASS
ok      otherPractice/go36/tests        11.283s
  • -benchtime设置运行时间,默认是1秒
  • -run=none用于不运行单元测试代码
  • -benchmem可以提供每次操作分配内存的次数,以及每次操作分配的字节数。从结果我们可以看到,指定容量的函数,每次操作进行11次内存分配,而不指定容量的函数的那个要分配275次;性能高的每次操作分配322236个字节内存,而慢的每次需要分配687122 字节的内存.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值