单元测试
参考文章:https://go.dev/doc/tutorial/add-a-test
1、原则
- 含有单元测试代码的 go 文件必须以 _test.go 结尾,_test.go 前面的部分最好是被测试的函数所在的 go文件的文件名,且应该将测试文件放在与被测文件同一个包下。
- 单元测试的函数名应该是TestName格式,其名字指明了做了什么具体的测试。
- 测试函数必须携带一个指向 testing包的testing.T指针,用此参数的方法来报告和记录测试,并且不能返回任何值。
定义一个斐波拉契函数
package test
func Fibonacci(n int) int {
if n < 0 {
return 0
}
if n == 0 {
return 0
}
if n == 1 {
return 1
}
return Fibonacci(n-1) + Fibonacci(n-2)
}
编写相应的测试方法
package test
import (
"testing"
)
func TestFibonacci(t *testing.T) {
// 预先定义的一组斐波那契数列作为测试用例(表驱动)
caseMap := map[int]int{
0: 0,
1: 1,
2: 1,
3: 2,
4: 3,
5: 5,
6: 8,
7: 13,
8: 21,
}
for k, v := range caseMap {
fib := Fibonacci(k)
if v == fib {
t.Logf("结果正确:n为%d,值为%d", k, fib)
} else {
t.Errorf("结果错误:期望%d,但是计算的值是%d", v, fib)
}
}
}
运行命令
go test -v .//运行整组测试
~/study/go/go/gin-example/routers/test💚💚💚💚go test -v .
=== RUN TestFibonacci
fibonacci_test.go:24: 结果正确:n为5,值为5
fibonacci_test.go:24: 结果正确:n为7,值为13
fibonacci_test.go:24: 结果正确:n为0,值为0
fibonacci_test.go:24: 结果正确:n为1,值为1
fibonacci_test.go:24: 结果正确:n为2,值为1
fibonacci_test.go:24: 结果正确:n为3,值为2
fibonacci_test.go:24: 结果正确:n为4,值为3
fibonacci_test.go:24: 结果正确:n为6,值为8
fibonacci_test.go:24: 结果正确:n为8,值为21
--- PASS: TestFibonacci (0.00s)
PASS
ok gin-example/routers/test 0.503s
使用断言
参考文章:https://pkg.go.dev/github.com/stretchr/testify/assert
assert包提供了一组全面的测试工具,可以与正常的 Go 测试系统一起使用。
go get -u github.com/stretchr/testify
- 每一个断言方法的第一个参数必须是测试框架提供的*testing T对象,帮助这允许断言函数将错误和其他细节写入正确的位置。
- 每一个断言方法都会返回一个bool,最后一个参数是可选的,用来显示错误信息。
package test
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestFibonacci(t *testing.T) {
// 预先定义的一组斐波那契数列作为测试用例(表驱动)
caseMap := map[int]int{
0: 0,
1: 1,
2: 1,
3: 2,
4: 3,
5: 5,
6: 8,
7: 13,
8: 21,
}
for k, v := range caseMap {
fib := Fibonacci(k)
assert.Equal(t, fib, v)
}
}
~/study/go/go/gin-example/routers/test💚💚💚💚go test -v .
=== RUN TestFibonacci
--- PASS: TestFibonacci (0.00s)
PASS
ok gin-example/routers/test 0.429s
常用的断言方法有:
- assert.Equal
- assert.NotEqual
- assert.Zero
- assert.NotZero
- assert.Nil
- assert.NotNil
TestMain
在测试开始前、结束后做的通用操作提取出来,使用setup()和teardown()方法,写在testmain方法中。
package test
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func setup() {
fmt.Println("test start")
}
func teardown() {
fmt.Println("test end")
}
func TestMain(m *testing.M) {
setup()
m.Run()
teardown()
}
func TestFibonacci(t *testing.T) {
// 预先定义的一组斐波那契数列作为测试用例(表驱动)
caseMap := map[int]int{
0: 0,
1: 1,
2: 1,
3: 2,
4: 3,
5: 5,
6: 8,
7: 13,
8: 21,
}
for k, v := range caseMap {
fib := Fibonacci(k)
assert.Equal(t, fib, v)
}
}
~/study/go/go/gin-example/routers/test💚💚💚💚go test -v .//运行整组测试
test start
=== RUN TestFibonacci
--- PASS