21、做中学 | 高一上期 |Golang单元测试

随着结构体越来越多,绑定的方法也是巨量增加,如何验证一个个函数是否正确运行呢?

一、探索

1. 处境

在练习语句、单个函数的时候,我们可以用main函数,并且包名改为main,简单直接调用一下。但随着结构体的介入,功能开始增加起来!

这个时候,不能再使用main函数,进行一个个的验证!

如何进行更有效的方法验证呢???

2. 搜寻问题

带着如何解决方法验证的问题,我们查询官方文档(https://studygolang.com/pkgdoc),找到一个testing包,官方描述如下:

go 复制代码
# testing 提供对 Go 包的自动化测试的支持。通过 `go test` 命令,能够自动执行如下形式的任何函数:
func TestXxx(*testing.T)

如下形式???任何函数???

好像可以解决自己的问题,但是要符合他们的形式要求!!

二、思考

1. 官网案例

go 复制代码
import "testing"

testing 提供对 Go 包的自动化测试的支持。通过 go test 命令,能够自动执行如下形式的任何函数:

go 复制代码
func TestXxx(*testing.T)

其中 Xxx 可以是任何字母数字字符串(但第一个字母不能是 a-z),用于识别测试例程。

在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。

要编写一个新的测试套件,需要创建一个名称以 _test.go 结尾的文件,该文件包含 TestXxx 函数,如上所述。 将该文件放在与被测试的包相同的包中。该文件将被排除在正常的程序包之外,但在运行 "go test" 命令时将被包含。 有关详细信息,请运行 "go help test" 和 "go help testflag" 了解。

如果有需要,可以调用 *T 和 *B 的 Skip 方法,跳过该测试或基准测试:

go 复制代码
func TestTimeConsuming(t *testing.T) {
    if testing.Short() {
        t.Skip("skipping test in short mode.")
    }
    ...
}

2. 案例反思

如果我们想要一个测试套件,如何复刻呢?需要注意哪些呢?

从官网案例反思如下:

  1. 创建文件名称必须以 _test.go 结尾
  2. 导入testing包
  3. 函数必须以:Test开头,用于识别测试例程。
  4. 参数类型必须是:*testing.T

三、尝试

1. 模仿

根据案例反思,进行编写测试函数

创建Sum_test.go文件

go 复制代码
package grade120

import (
	"fmt"
	"testing"
)

func TestSum(t *testing.T) {
	a := 10
	b := 20
	c := a + b
	fmt.Println("c = ", c)
}

//=== RUN   TestSum
//c =  30
//--- PASS: TestSum (0.00s)
//PASS

符合了上述四个要求,进行正确执行了函数、符合自己以后要验证函数的需求。

2. 扩展

上边是正确执行的函数,如果是抛出异常的函数呢?

go 复制代码
func TestDivided(t *testing.T) {
	a := 10
	b := 0
	c := a / b
	fmt.Println("c = ", c)
}
//=== RUN   TestDivided
//--- FAIL: TestDivided (0.00s)
//panic: runtime error: integer divide by zero [recovered]
//	panic: runtime error: integer divide by zero
// ......

可以看到输出的错误日志

3. 自定义成功/失败

上边为程序正常和代码异常情况,有没有可以手动指定成功或者失败呢?

比如存储一条数据的时候,service返回成功或者失败,从而判断该方法是通过还是失败!

t.Logf()进行成功格式化输出

go 复制代码
func TestDividedSuccessLog(t *testing.T) {
	c := 2 + 3
	t.Logf("c = %d", c)
}

//=== RUN   TestDividedSuccessLog
//Sum_test.go:44: c = 5
//--- PASS: TestDividedSuccessLog (0.00s)
//PASS

t.Fatalf()进行错误格式化输出

go 复制代码
func TestDividedLog(t *testing.T) {
	c := 2 + 3
	t.Fatalf("c = %d", c)
}

//=== RUN   TestDividedLog
//Sum_test.go:34: c = 5
//--- FAIL: TestDividedLog (0.00s)
//
//FAIL

附

本篇为探索篇,主要是解决方法过多而造成的测试和管理,比较麻烦!

本篇内容不是很难,格式要求符合testing包要求,一般都可以进行测试进程扫描执行!

相关推荐
吧啦蹦吧18 小时前
org.springframework.context.ApplicationListener
log4j
紧跟先前的步伐18 小时前
Go AI Agent 实战 22|完善 Agent 执行循环:从工具调用到最终回答
人工智能·ai·golang
后台模板学习19 小时前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
FungLeo20 小时前
成为全栈·Go 后端篇·分类树与标签关系:目录变更为何需要协调
golang·go·gorm·数据库事务·分类树·成为全栈
fly-iot20 小时前
【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c
开发语言·人工智能·golang
FungLeo20 小时前
成为全栈·Go 后端篇·文章查询与展示投影:安全分页、排序和软删除
golang·go·gorm·分页查询·成为全栈·sql安全
梦想不只是梦与想1 天前
鸿蒙 AI自动化测试实现
单元测试·harmonyos·hypium
紧跟先前的步伐1 天前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节
光影6271 天前
Unittest单元测试基础速记
测试工具·单元测试·json·测试覆盖率
日日大王学编程1 天前
#Feed 流项目复盘:Redis 时间线缓存与 Outbox 消息可靠性设计
golang·1024程序员节