单元测试的引出
- 先看一个需求
- 在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确
- 如:
![](https://i-blog.csdnimg.cn/blog_migrate/27629b006c6c11171c1f0fff2b609c23.png)
- 传统的方式来进行测试
- 在 main 函数中,调用 addUpper 函数,看看实际输出的结果是否和预期的结果一致
- 如果一致,则说明函数正确,否则函数有错误,然后修改错误
package main
import (
_ "fmt"
)
//一个被测试函数
func addUpper(n int) int {
res := 0
for i := 1; i <= n - 1; i++ {
res += i
}
return res
}
func addUpper2(n int) int {
res := 0
for i := 1; i <= n - 1; i++ {
res += i
}
return res
}
func main() {
//传统的测试方法,就是在main函数中使用看看结果是否正确
res := addUpper(10) // 1.+ 10 = 55
if res != 55 {
fmt.Printf("addUpper错误 返回值=%v 期望值=%v\n", res, 55)
} else {
fmt.Printf("addUpper正确 返回值=%v 期望值=%v\n", res, 55)
}
}
- 传统方法的缺点分析
- 不方便, 我们需要在 main 函数中去调用,这样就需要去修改 main 函数,如果现在项目正在运行,就可能去停止项目。
- 不利于管理,因为当我们测试多个函数或者多个模块时,都需要写在 main 函数,不利于我们管理和清晰我们思路
- 引出单元测试 --> testing 测试框架 可以很好解决问题。
单元测试基本介绍
- Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命令来实现单元测试和性能测试
- testing 框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例。
- 通过单元测试,可以解决如下问题:
- 1) 确保每个函数是可运行,并且运行结果是正确的
- 2) 确保写出来的代码性能是好的,
- 3) 单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定
![](https://i-blog.csdnimg.cn/blog_migrate/01b0f3cfbab707000e69aad5e02f7558.png)
![](https://i-blog.csdnimg.cn/blog_migrate/80aee977dc24e75b88fcf03807a27db3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c3834d94cc5b7707800c14c949fe77f5.png)
演示案例1:
- 使用 Go 的单元测试,对 addUpper 和 sub 函数进行测试
- 目录结构:
![](https://i-blog.csdnimg.cn/blog_migrate/8477c63fb19063808ac781513454a2dc.png)
package cal
//一个被测试函数
func addUpper(n int) int {
res := 0
for i := 1; i <= n - 1; i++ {
res += i
}
return res
}
package cal
import (
_ "fmt"
"testing" //引入go 的testing框架包
)
//编写要给测试用例,去测试addUpper是否正确
func TestAddUpper(t *testing.T) {
//调用
res := addUpper(10)
if res != 55 {
//fmt.Printf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)
t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)
}
//如果正确,输出日志
t.Logf("AddUpper(10) 执行正确...")
}
![](https://i-blog.csdnimg.cn/blog_migrate/ece880367338cc5ee4683d6ebaf21dfb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c18ce8bd2afb35e107da4897c4485545.png)
演示案例2:
![](https://i-blog.csdnimg.cn/blog_migrate/0e9f4c0e1c7c700ed7a7e4da5cbc8844.png)
package cal
//一个被测试函数
func addUpper(n int) int {
res := 0
for i := 1; i <= n ; i++ {
res += i
}
return res
}
//求两个数的查
func getSub(n1 int, n2 int) int {
return n1 - n2
}
package cal
import (
"fmt"
"testing" //引入go 的testing框架包
)
//编写要给测试用例,去测试addUpper是否正确
func TestAddUpper(t *testing.T) {
//调用
res := addUpper(10)
if res != 55 {
//fmt.Printf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)
t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)
}
//如果正确,输出日志
t.Logf("AddUpper(10) 执行正确...")
}
func TestHello(t *testing.T) {
fmt.Println("TestHello被调用..")
}
package cal
import (
_ "fmt"
"testing" //引入go 的testing框架包
)
//编写要给测试用例,去测试addUpper是否正确
func TestGetSub(t *testing.T) {
//调用
res := getSub(10, 3)
if res != 7 {
//fmt.Printf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)
t.Fatalf("getSub(10, 3) 执行错误,期望值=%v 实际值=%v\n", 7, res)
}
//如果正确,输出日志
t.Logf("getSub(10, 3) 执行正确!!!!...")
}
![](https://i-blog.csdnimg.cn/blog_migrate/c838b59df400e1469c343319a5717145.png)