文章目录
Golang单元测试
golang提供了标准库testing
用来支持测试
import "testing"
Golang支持的测试种类
类型 | 格式 | 作用 |
---|---|---|
单元测试 | 函数名前缀为Test | 测试程序的一些逻辑行为是否正确 |
基准(压力)测试 | 函数名前缀为Benchmark | 测试函数的性能 |
示例测试 | 函数名前缀为Example | 为文档提供示例文档 |
模糊(随机)测试 | 函数名前缀为Fuzz | 生成一个随机测试用例去覆盖认为测不到的各种赋值场景 |
单元测试
Go语言推荐测试文件和源代码文件放在一块,测试文件以_test.go
结尾。
比如,当前package有calc.go
一个文件,我们想测试calc.go
中的Add
和Mul
函数,那么一个新建calc_test.go
作为测试文件。
注意:创建项目后需要
go mod init
初始化项目
实例演示:
calc.go
package main
func Add(a int, b int) int {
return a + b
}
func Mul(a int, b int) int {
return a * b
}
calc_test.go
package main
import "testing"
func TestADD(t *testing.T) {
if ans := Add(1, 2); ans != 3 {
t.Errorf("1 + 2 expected be 3, but %d got", ans)
}
if ans := Add(-10, -20); ans != -30 {
t.Errorf("-10 + -20 expected be -30, but %d got", ans)
}
}
- 测试用例名称一般命名为
Test
加上待测试的方法名- 测试用的参数有且只有一个,在这里是
t *testing.T
- 基准测试(Benchmark)的参数是
*testing.B
类型- TestMain的参数是
*testing.M
类型
run test
结果为:
Running tool: C:\Go\bin\go.exe test -timeout 30s -run ^TestADD$ go_pro
ok go_pro 0.272s
还可以在终端运行 go test
,则该包下的所有测试用例都会被执行
PS E:\golang开发学习\go_pro> go test
PASS
ok go_pro 0.244s
PASS表示测试用例运行成功,FAIL表示测试用例运行失败
或使用 go test -v
,-v
参数会显示每个用例的测试结果,另外-cover
参数可以查看覆盖率
PS E:\golang开发学习\go_pro> go test -v
=== RUN TestADD
--- PASS: TestADD (0.00s)
PASS
ok go_pro 0.245s
PS E:\golang开发学习\go_pro> go test -cover
PASS
coverage: 50.0% of statements
ok go_pro 0.417s
如果只想运行其中一个用例,例如TestADD
,可以用-run
参数指定,该参数支持通配符*
,和部分正则表达式,如^
、$
。
PS E:\golang开发学习\go_pro> go test -run TestADD -v
=== RUN TestADD
--- PASS: TestADD (0.00s)
PASS
ok go_pro 0.180s
单元测试框架提供的日志方法
方法 | 作用 |
---|---|
Log | 打印日志,同时结束测试 |
Logf | 格式化打印日志,同时结束测试 |
Error | 打印错误日志,同时结束测试 |
Errorf | 格式化打印错误日志,同时结束测试 |
Fatal | 打印致命日志,同时结束测试 |
Fatalf | 格式化打印致命日志,同时结束测试 |
子测试(Subtests)
子测试是Go语言内置支持的,可以在摸个测试用例中,根据测试场景使用t.Run
创建不同的子测试用例
calc_test.go
func TestMul(t *testing.T) {
t.Run("pos", func(t *testing.T) {