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 函数跳过并终止执行测试。


相关文章
|
8月前
|
人工智能 自然语言处理 安全
学不会编程也能写测试?AI让测试更平权
在传统的软件开发体系中,测试常被划分为“技术型测试”(如自动化、性能、安全)和“业务型测试”(如功能验证、用户体验)。前者掌握技术话语权,后者则更多依赖经验和流程规范。然而,随着大语言模型(LLM)等AI技术的迅猛发展,这一固有格局正被悄然打破:
265 10
|
8月前
|
设计模式 缓存 算法
Go如何进行高质量编程与性能调优实践
本文介绍了Go语言高质量编程与性能调优的实践方法。高质量编程包括良好的编码习惯(如清晰注释、命名规范)、代码风格与设计(如MVC模式)、简洁明了的代码原则,以及单元测试与代码重构的重要性。性能调优方面,涵盖算法优化、数据结构选择、I/O优化、内存管理、并行与并发处理优化及代码层面的改进。通过这些方法,可有效提升代码质量和系统性能。
182 13
|
8月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
213 10
|
10月前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
人工智能 自然语言处理 前端开发
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
CodeArena 是一个在线平台,用于测试和比较不同大型语言模型(LLM)的编程能力。通过实时显示多个 LLM 的代码生成过程和结果,帮助开发者选择适合的 LLM,并推动 LLM 技术的发展。
559 7
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
946 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
测试技术 Python
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
本文介绍了Python的unittest框架的基础用法,包括测试初始化(setup)、清除(tearDown)函数的使用,以及assertEqual和assertGreaterEqual等断言方法,并展示了如何创建测试用例,强调了测试函数需以test_开头才能被运行。
258 1
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
247 7
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
228 1
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
246 4