这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
1. 引出
在编写代码过程中,会出现需要确认一个函数或一个模块的结果是否正确,而传统的测试方法需要我们在 main 函数中去调用,不方便也不利于管理,因此我们引出了单元测试,它可以很好的解决问题
2. 基本介绍
Go 语言中自带一个轻量级的测试框架 testing 和自带的 go test 命令来实现单元测试和性能测试(基准测试):
- 通过单元测试,我们便可以及时的发现程序设计或实现的逻辑错误,从而定位和解决问题
- 而性能测试(基准测试)的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定
我们接下来主要来讲讲单元测试
3. 快速入门
需求:使用 GO 的单元测试,编写 addUpper 函数并对其进行测试
代码示例:
// add.go 文件
func addUpper(n int) int { // 被测试函数
res := 0
for i := 1; i < n; i++ {
res += i
}
return res
}
// add.test.go 文件
func TestAddUpper(t *testing.T) { // 编写测试用例, 测试函数 addUpper
// 调用
res := addUpper(10)
if res != 55 {
// fmt.Println("AddUpper(10) 执行错误")
t.Fatalf("AddUpper(10) 执行错误, 期望值=%v 实际值=%v\n", 55, res) // 输出日志后退出
}
// 若正确, 则输出日志
t.Logf("AddUpper(10) 执行错误")
}
运行结果:
=== RUN TestAddUpper
add_test.go:13: AddUpper(10) 执行错误, 期望值=55 实际值=45
--- FAIL: TestAddUpper (0.00s)
FAIL
分析:testing 框架会将 xxx.test.go 的文件引入
main() { 调用 TestXxx() 函数 }
4. 具体细节说明
-
测试用例文件名必须以
_test.go结尾,比如上面编写的 add_test.go,add 不是固定的 -
测试用例函数必须以 Test 开头,一般来说就是 Test + 被测试的函数名,比如 TestAddUpper,要注意的是
Test 后跟的第一个字母必须大写 -
测试用例函数的形参类型必须是
*testingT,如 TestAddUpper(t *tesingT) -
一个测试用例文件中,可以有多个测试用例函数,比如 TestAddUpper、TestSub
-
当出现错误时,可以使用
tFatalf来格式化输出错误信息,并退出程序 -
tLogf方法可以输出相应的日志
5. 总结
实际开发中,测试往往是避免事故的最后一道屏障!
参考:
-
字节内部课:GO入门-工程实践