Go的testing
包为自动测试提供支持,它与go test
命令一起使用。测试文件和测试函数需要满足下面的条件:
*_test.go
文件TestName
格式,Name
以大写字母开头在feibo.go
文件中定义了一个生成斐波拉契序列的方法,通过它来依次介绍Go中的测试。
package main
import (
"errors"
)
func fibo(n int) int {
if n == 0 || n == 1 {
return 1
}
return fibo(n-1) + fibo(n-2)
}
func fibonacci(n int) (sequence []int, err error) {
if n < 0 {
return []int{}, errors.New("param shouldn't less than zero")
}
for i := 0; i <= n; i++ {
sequence = append(sequence, fibo(i))
}
return
}
默认go test
执行所有单元测试函数,支持go build
参数。-v
标识会显示所有测试函数执行的细节,-run regex
会执行指定的测试函数(正则表达式)。
// feibo_test.go文件
package main
import (
"errors"
"reflect"
"testing"
)
// 用来存储测试用例的结构
type fTest struct {
in int
out []int
err error
}
var fTests = []fTest{
{-1, []int{}, errors.New("param shouldn't less than zero")},
{0, []int{1}, nil},
{1, []int{1, 1}, nil},
{5, []int{1, 1, 2, 3, 5, 8}, nil},
}
var BenchSink int
func TestFibo(t *testing.T) {
for _, value := range fTests {
if res, _ := fibonacci(value.in); !reflect.DeepEqual(res, value.out) {
t.Errorf("fibonacci: [%v], actually: [%v]", value.out, res)
}
}
}
func BenchmarkFibo(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, value := range fTests {
res, _ := fibonacci(value.in)
BenchSink += len(res)
}
}
}
进行测试
D:\gotest>go test feibo.go feibo_test.go -v
=== RUN TestFibo
--- PASS: TestFibo (0.00s)
PASS
ok command-line-arguments 0.137s
性能测试需要运行足够多的次数才能计算单次执行平均时间,默认情况下,go test
不会执行性能测试函数,必须使用-bench
参数。go test -bench regexp
,仅仅会运行匹配正则表达式的基准测试。要运行所有的基准测试,使用-bench .
或者-bench=.
。测试结果一般如下面的结构:
D:\gotest>go test -bench=. feibo.go feibo_test.go -v
=== RUN TestFibo
--- PASS: TestFibo (0.00s)
goos: windows
goarch: amd64
BenchmarkFibo-12 5000000 262 ns/op
PASS
ok command-line-arguments 1.714s
运行基准测试的环境,操作系统和架构。测试的次数5000000
,这个数值不固定,b.N
会根据函数的运行时间取一个合适的值。262 ns/op
表示执行一次操作所需要的纳秒。
测试覆盖率是度量测试有效性的一个手段,测试覆盖是由测试需求和测试用例的覆盖或已执行代码的覆盖表示的。使用参数-cover
来进行覆盖率分析。测试结果一般如下面的结构:
D:\gotest>go test -cover feibo.go feibo_test.go -v
=== RUN TestFibo
--- PASS: TestFibo (0.00s)
PASS
coverage: 100.0% of statements
ok command-line-arguments 0.132s coverage: 100.0% of statements