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

王者杯·14天创作挑战营·第8期 10w+人浏览 231人参与

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

一、探索

1. 处境

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

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

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

2. 搜寻问题

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

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

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

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

二、思考

1. 官网案例

import "testing"

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

func TestXxx(*testing.T)

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

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

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

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

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文件

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. 扩展

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

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()进行成功格式化输出

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()进行错误格式化输出

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值