golang 单元测试入门
Alex 7/16/2020 golang单元测试
# 单元测试
对系统进行最小粒度的测试,具体到测试某个函数或表达式。
golang 直接为我们提供了单元测试工具 go test
# 入门 Go test
所有的测试用例,文件名都应该以 _test.go 结束,方法名都应该以 Test 开始
待测试文件 main.go
package main
import "math"
func Pow2(x float64) float64 {
return math.Pow(x, 2)
}
1
2
3
4
5
6
7
2
3
4
5
6
7
测试用例 main_test.go
package main
import (
"testing"
)
func TestPow(t *testing.T) {
cases := []struct {
x float64
y float64
}{
{2, 4},
{1, 1},
{4, 16},
{8, 64},
{1000, 1000000},
}
for _, option := range cases {
y := Pow2(option.x)
if y != option.y {
t.Error(y)
}
t.Log(y)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
运行测试
go test 在调用 Error 等API时,将会终止测试,并认为本次测试失败
$ go test
PASS
ok org.println/go-mod-test 0.833s
1
2
3
2
3
# 测试替身 Mock
未完待续
# 打桩 Stub
未完待续
# 相关API
所有API一览 https://golang.org/pkg/testing/#pkg-index
本文只介绍部分API
Type T 方法签名 | 作用 |
---|---|
func (c *T) Cleanup(f func()) | 测试及其所有子测试完成时调用的方法 |
func (c *T) Error(args ...interface{}) | 等同于 Log 但会终止测试 |
func (c *T) Errorf(format string, args ...interface{}) | 对 Error 提供格式化支持,语法同 printf |
func (c *T) Fail() | 标记测试失败,但不终止测试 |
func (c *T) Failed() bool | 在测试失败的时候抛出异常 |
func (c *T) Fatal(args ...interface{}) | 等于 FailNow,但会终止测试 |
func (c *T) Fatalf(format string, args ...interface{}) | 对 FailNow 提供格式化支持,语法同 printf |
func (c *T) Helper() | 将调用的函数标记为助手函数 |
func (c *T) Log(args ...interface{}) | Log 打印日志,不会造成测试终止 |
func (c *T) Logf(format string, args ...interface{}) | 对 Log 提供格式化支持,语法同 printf |
func (c *T) Name() string | 返回正在运行的测试的名称 |
func (c *T) Skip(args ...interface{}) | 等同于 Log,后支持 SkipNow |