go/golang语言编写压力测试
近期复习了一下go,发现go的压力测试是个好东西。记录一下怎么使用。
压力测试用来检测函数(方法)的性能,和编写单元功能测试的方法类似,此处不再赘述,但需要注意以下几点:
压力测试用例必须遵循如下格式,其中XXX可以是任意字母数字的组合,但是首字母不能是小写字母
func BenchmarkXXX(b *testing.B) { ... }
go test不会默认执行压力测试的函数,如果要执行压力测试需要带上参数-test.bench,语法:-test.bench=“test_name_regex”,例如go test -test.bench=".*"表示测试全部的压力测试函数。在压力测试用例中,请记得在循环体内使用testing.B.N,以使测试可以正常的运行文件名也必须以_test.go结尾
直接上代码,项目结构很简单,如下:
代码,web.go:
package webtest
import "errors"
func Division(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不合法,不能为0")
}
return a / b, nil
}
代码,web_test.go
package webtest
import "testing"
func BenchmarkDivision(b *testing.B) {
for i := 0; i < b.N; i++ {
Division(7,8)
}
}
func Benchmark_TimeConsumingFunction(b *testing.B) {
b.StopTimer() // 调用该函数停止压力测试的时间计数
// 做一些初始化,例如读取文件数据,数据库连接之类的
// 这样这些时间不影响我们测试函数本身的性能
b.N = 1000 // 可以修改执行次数
b.StartTimer() // 重新开始时间计时
for i := 0; i < b.N; i ++ {
Division(7,8)
}
}
命令行进入到项目目录中,执行命令:
go test -test.bench=".*"
可以得到如下执行结果(mac):
goos: darwin
goarch: amd64
pkg: github.com/mycode/web_test
BenchmarkDivision-4 2000000000 0.34 ns/op
Benchmark_TimeConsumingFunction-4 1000 0.98 ns/op
PASS
ok github.com/mycode/web_test 0.730s
第一条显示了Benchmark_Division执行了2000000000次,每次的执行平均时间是0.34纳秒,第二条显示了Benchmark_TimeConsumingFunction执行了1000(修改后的次数),每次的平均执行时间是0.98纳秒。最后一条显示总共的执行时间。