go/golang语言编写压力测试

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结尾

直接上代码,项目结构很简单,如下:go/golang语言编写压力测试_第1张图片

代码,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纳秒。最后一条显示总共的执行时间。

你可能感兴趣的:(go/golang)