一 问题引出
在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确。
例如,我们会遇到测试下面函数是否正确。
func addUpper(n int) int {
res := 0
for i := 1; i <= n; i++ {
res += i
}
return res
}
二 传统的方法
1 用传统方式进行测试
在 main 函数中,调用 addUpper 函数,看看实际输出的结果是否和预期的结果一致,如果一致,则说明函数正确,否则函数有错误,然后修改错误。
2 代码
package main
import (
"fmt"
)
// 一个被测试函数
func addUpper(n int) int {
res := 0
for i := 1; i <= n-1; i++ {
res += i
}
return res
}
func main() {
// 传统的测试方法,就是在 main 函数中测试,看看结果是否正确
res := addUpper(10)
if res != 55 {
fmt.Printf("addUpper错误 返回值=%v 期望值=%v\n", res, 55)
} else {
fmt.Printf("addUpper正确 返回值=%v 期望值=%v\n", res, 55)
}
}
3 测试
addUpper错误 返回值=45 期望值=55
三 传统方法的缺点分析
1 不方便, 我们需要在 main 函数中去调用,这样就需要去修改 main 函数,如果现在项目正在运行,就可能去停止项目。
2 不利于管理,因为当我们测试多个函数或者多个模块时,都需要写在 main 函数,不利于我们管理和清晰我们思路。
3 go 引出单元测试。testing 测试框架可以很好解决问题。
四 单元测试基本介绍
Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命令来实现单元测试和性能测试,testing 框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题。
1 确保每个函数是可运行,并且运行结果是正确的。
2 确保写出来的代码性能是好的。
3 单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定。