Go 编程 | 连载 33 - UnitTest 单元测试

简介: Go 编程 | 连载 33 - UnitTest 单元测试

一、Go testing 标准库

Go 语言提供了 testing 标准库用于至此 Go 语言代码的测试,在编写 Go 语言的测试时需要遵循两个规范:

  • Go 的测试代码和被测试代码在同一目录下,不同于 Java 的测试代码是单独在 test 包下。
  • Go 的测试代码所在文件要添加后缀 _test,且测试代码中函数的名字要以 TestXxx 命名
.
├── zulu.go
└── zulu_test.go
0 directories, 2 files
复制代码
func TestXxx(t *testing.T) {
    // 测试代码
}
复制代码

TestXxx 函数的参数除了可以是 *testing.T 外,还可以选择 *testing.B*testing.B*testing.M 等,它们都表示不同类型的测试。

二、第一个 Go 的单元测试

新建一个 test 目录,在该目录下新建 zulu.gozulu_test.go,在这两个文件中增加代码

// zulu.go
package main
import "fmt"
func Add(x, y int) int {
   fmt.Println("Add 方法被调用")
   return x + y
}
复制代码
// zulu_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
   x, y := 2, 3
   sum := Add(x, y)
   expect := 2 + 3
   if sum != expect {
      t.Error("失败")
   }
}
复制代码

执行 zulu_test.go 文件

2cdad18f57424ef1b076322b7432bc0e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

根据输出内容,可以确定测试执行成功。

上述代码中通过 t.Error 来输出错误信息,也可以使用 Fail 方法来输出错误信息

数据驱动测试

上述代码中仅仅执行了一次测试用例,在实际项目中会针对同一个测试用例使用不同的数据进行多次测试

func TestAdd(t *testing.T) {
   // 构造一个参数结构体的切片
   params := []Param {
      {1, 2, 3},
      {5, 6, 11},
      {3, 7, 10},
      {2, 6, 8},
      {2, 2, 3},
   }
   for _, param := range params {
      sum := Add(param.x, param.y)
      if sum != param.expect {
         t.Errorf("%d != %d\n", sum, param.expect)
         t.Errorf("出现错误的数据为:%v, %v\n", param.x, param.y)
      }
   }
}
type Param struct {
   x int
   y int
   expect int
}
复制代码

执行上述代码,输出结果如下:

2ad41f162076432182e971a20af5adc0_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

根据结果可以确定,TestAdd 方法调用了 5 次,最后一次参数为 2,2 的时候用例执行失败。

三、testing.T 类型

在上面的单元测试中,TestXxx 函数传递的参数为 *testing.T,该参数用于管理测试状态并支持格式化输出测试日志。

2935e5e675d74fc1b2d24802c0084a25_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

当 TestXxx 函数返回时,T 调用 TB 接口中的 FailNowFatalFatalfSkipNowSkipSkipf 中的任意一个时,则宣告该测试函数结束。

当测试用例结果断言失败时:

方法 说明
Fail 测试失败,剩下用例继续执行
FailNow 测试失败,测试中断
SkipNow 跳过测试,测试中断
Log 输出信息
Logf 格式化输出信息
Skip Log + SkipNow
Skipf Logf + SkipNow
Error Log + Fail
Errorf Logf + Fail
Fatal Log + FailNow
Fatalf Logf + FailNow
func TestAdd(t *testing.T) {
   // 构造一个参数结构体的切片
   params := []Param {
      {1, 2, 3},
      {5, 6, 11},
      {3, 7, 10},
      {2, 6, 8},
      {2, 2, 3},
   }
   for _, param := range params {
      sum := Add(param.x, param.y)
      if sum != param.expect {
         t.Errorf("%d != %d\n", sum, param.expect)
         t.Errorf("出现错误的数据为:%v, %v\n", param.x, param.y)
      }
      if param.x == 3 {
         t.Skipf("参数为 %v\n", param.x)
      }
   }
}
复制代码

执行上述代码,输出结果如下:

b3ebd4a0eede46e7ae10bb42c08e5cba_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

在 if 条件满足时,使用 Skipf 函数跳过并终止执行测试。


相关文章
|
7天前
|
SQL 安全 数据库连接
《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)(上)
《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)
31 1
|
1月前
|
Java
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
36 0
|
3月前
|
安全 Go 数据处理
Go语言CSP编程实战:通道通信技术
Go语言CSP编程实战:通道通信技术
43 0
|
3月前
|
Go
高效Go语言编程:os包实用技术大揭示
高效Go语言编程:os包实用技术大揭示
44 0
|
1月前
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
|
1天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
4天前
|
前端开发 测试技术 C++
Python自动化测试面试:unittest、pytest与Selenium详解
【4月更文挑战第19天】本文聚焦Python自动化测试面试,重点讨论unittest、pytest和Selenium三大框架。unittest涉及断言、TestSuite和覆盖率报告;易错点包括测试代码冗余和异常处理。pytest涵盖fixtures、参数化测试和插件系统,要注意避免过度依赖unittest特性。Selenium的核心是WebDriver操作、等待策略和测试报告生成,强调智能等待和元素定位策略。掌握这些关键点将有助于提升面试表现。
18 0
|
1月前
|
测试技术 持续交付
单元测试模块化编程
单元测试模块化编程
16 1
|
1月前
|
Go 开发工具 git
编程笔记 GOLANG基础 003 Go语言开发环境搭建
编程笔记 GOLANG基础 003 Go语言开发环境搭建
|
1月前
|
存储 Java Go
编程笔记 GOLANG基础 002 Go语言简介
编程笔记 GOLANG基础 002 Go语言简介