Golang单元测试

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

你可能感兴趣的:(GO学习总结)