Go 单元测试的引出及应用

单元测试的引出

  • 先看一个需求
    • 在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确
  • 如:

  • 传统的方式来进行测试
    • 在 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) 单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定

演示案例1:

  • 使用 Go 的单元测试,对 addUpper sub 函数进行测试
  • 目录结构:

  • cal.go文件
package cal

//一个被测试函数
func addUpper(n int)  int {
	res := 0
	for i := 1; i <= n - 1; i++ {
		res += i
	}
	return res
}
  • cal_test.go文件
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) 执行正确...")
}
  • 测试结果:

  • 示意图:


演示案例2:

  • cal.go文件
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
}
  • cal_test.go文件
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被调用..")

}
  • sub_test.go文件
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) 执行正确!!!!...")

}

  • 测试结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值