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

相关推荐
开五档的蒙奇7 小时前
【单元测试】Junit5 + Mockito
单元测试
程序员雷叔18 小时前
在postman设置请求里带动态token,看看这两种方法!
selenium·测试工具·单元测试·测试用例·pytest·lua·postman
源代码•宸18 小时前
Golang原理剖析(channel面试与分析)
开发语言·经验分享·后端·面试·golang·select·channel
moxiaoran575320 小时前
Go语言中的泛型
golang
加油201920 小时前
GO语言内存逃逸和GC机制
golang·内存管理·gc·内存逃逸
源代码•宸21 小时前
Golang原理剖析(channel源码分析)
开发语言·后端·golang·select·channel·hchan·sudog
liuyunshengsir21 小时前
golang Gin 框架下的大数据量 CSV 流式下载
开发语言·golang·gin
CHHC188021 小时前
golang 项目依赖备份
开发语言·后端·golang
老蒋每日coding21 小时前
AI智能体设计模式系列(八)—— 记忆管理模式
人工智能·设计模式·golang
且去填词2 天前
深入理解 GMP 模型:Go 高并发的基石
开发语言·后端·学习·算法·面试·golang·go