Go代码测试
2018-12-19 本文已影响0人
Rnben
Go代码测试
- 功能测试(test)
测试函数Test
开头,参数列表应只有一个*testing.T
类型的参数声明。
- 基准测试(benchmark)
测试函数Benchmark
开头,参数列表应只有一个*testing.B
类型的参数声明。
- 示例测试(example)
测试函数Example
开头,参数列表列表没有强制要求。
单元测试
单元测试编写规则
- 文件名必须是
_test.go
结尾 - 所有的测试用例函数必须
Test
开头 - 测试函数
TestXxx()
的参数是testing.T
- 函数中通过调用
testing.T
的Error
,Errorf
,FailNow
,Fatal
,FatalIf
方法,说明测试不通过,调用Log
方法用来记录测试的信息。 - 单元测试用例必须遵循如下格式:
func TestXxx (t *testing.T) {... }
单元测试demo
package gotest
import (
"errors"
"testing"
)
func Division(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不能为0")
}
return a / b, nil
}
func Test_Division_1(t *testing.T) {
if i, e := Division(6, 2); i != 3 || e != nil { //try a unit test on function
t.Error("除法函数测试没通过") // 如果不是如预期的那么就报错
} else {
t.Log("第一个测试通过了") //记录一些你期望记录的信息
}
}
func Test_Division_2(t *testing.T) {
t.Error("就是不通过")
}
压力测试
压力测试编写规则
- 文件名也必须以
_test.go
结尾 -
go test
不会默认执行压力测试的函数 - 执行压力测试需要带上参数
-test.bench
- 在循环体内使用
testing.B.N
压力测试用例必须遵循如下格式:
func BenchmarkXXX(b *testing.B) { ... }
压力测试demo
package gotest
import (
"errors"
"testing"
)
func Division(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不能为0")
}
return a / b, nil
}
func Benchmark_Division(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
Division(4, 5)
}
}
func Benchmark_TimeConsumingFunction(b *testing.B) {
b.StopTimer() //调用该函数停止压力测试的时间计数
//做一些初始化的工作,例如读取文件数据,数据库连接之类的,
//这样这些时间不影响我们测试函数本身的性能
b.StartTimer() //重新开始时间
for i := 0; i < b.N; i++ {
Division(4, 5)
}
}
扩展
-
go test
命令的标记-cpu
,用来设计测试执行最大逻辑CPU数,上限为当前计算机CPU实际核心数。 -
-count
用于重复执行测试函数,默认为1。 -
parallel
设置同一个被测试代码包中的功能测试函数的最大并发执行数,默认是最大P
(runtime.GOMAXPROCS(0));对性能测试无效。