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包要求,一般都可以进行测试进程扫描执行!

相关推荐
熬了夜的程序员1 小时前
【RUSTFS】rustfs的go语言sdk
开发语言·后端·golang
卿雪2 小时前
缓存异常:缓存击穿、缓存穿透、缓存雪崩 及其解决方案
java·数据库·redis·python·mysql·缓存·golang
wan_da_ren2 小时前
Windows 环境下使用 Go Modules 拉取带外层 Basic Auth 的私有 GitLab 仓库 — 完整解决方案
windows·golang·gitlab
卿雪2 小时前
Redis的数据类型 + 底层实现:String、Hash、List、Set、ZSet
数据结构·数据库·redis·python·mysql·缓存·golang
liupenglove2 小时前
go-echarts基础使用方法
开发语言·golang·echarts
Tony Bai3 小时前
Go 2025云原生与可观测年度报告:底层性能革新与生态固防
开发语言·后端·云原生·golang
卿雪3 小时前
MySQL【索引】:索引的概念与分类
java·数据库·python·mysql·adb·golang
资深web全栈开发3 小时前
从零构建即时通讯系统:Go + Vue3 实战指南
开发语言·后端·golang·im 通许
源代码•宸4 小时前
GoLang并发示例代码2(关于逻辑处理器运行顺序)
服务器·开发语言·经验分享·后端·golang