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

相关推荐
源代码•宸5 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
软件检测小牛玛1 天前
具备软件功能测试资质的机构哪家更权威?山东软件测评机构 中承信安
功能测试·单元测试·软件测试报告·软件测评机构
闻哥1 天前
从测试坏味道到优雅实践:打造高质量单元测试
java·面试·单元测试·log4j·springboot
有代理ip1 天前
Python 与 Golang 爬虫的隐藏优势
爬虫·python·golang
天远云服1 天前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang
Warren981 天前
Pytest Fixture 作用域与接口测试 Token 污染问题实战解析
功能测试·面试·单元测试·集成测试·pytest·postman·模块测试
女王大人万岁2 天前
Go标准库 sync 详解
服务器·开发语言·后端·golang
小高Baby@2 天前
session、cookie、Jwt-token
开发语言·后端·golang
知行合一。。。2 天前
程序中的log4j、stderr、stdout日志
python·单元测试·log4j