Go 编程 | 连载 35 - testing 标准库的其他功能

简介: Go 编程 | 连载 35 - testing 标准库的其他功能

一、Test Coverage 覆盖率

测试覆盖率是度量代码测试详尽程度的指标,它指出了被测试的代码在全部代码中所占的百分比,Go 的 testing 标准库中也提供了测试覆盖率的指标。

我们以 tango.go 文件中的三个函数为测试目标,新建一个文件 tango_coverage_test.go 将其中两个函数进行测试。

package main
import (
   "testing"
)
func TestStringFromAssignment(t *testing.T) {
   StringFromBuffer(10)
}
func TestStringFromAppendJoin(t *testing.T) {
   StringFromAppendJoin(10)
}
复制代码

在命令行中输入 go test -cover 执行测试并获取测试覆盖率

$ go test -cover -v tango_coverage_test.go tango.go
=== RUN   TestStringFromAssignment
--- PASS: TestStringFromAssignment (0.00s)
=== RUN   TestStringFromAppendJoin
--- PASS: TestStringFromAppendJoin (0.00s)
PASS
coverage: 66.7% of statements
ok      command-line-arguments  0.402s  coverage: 66.7% of statements
复制代码

命令执行结果表明测试都已经通过,但是覆盖率只有 66.7%,并未达到 100%。

二、测试验证 ExampleXxx

testing 标准库除了提供测试功能外还提供了验证的功能,验证相关的函数都是以 ExampleXxx 命名的。

新建一个 whiskey.go 文件,输入如下代码:

package main
import "fmt"
func ExampleHallo() {
   fmt.Println("Hallo")
   // Output: Hallo
}
复制代码

执行该测试

=== RUN   ExampleHallo
--- PASS: ExampleHallo (0.00s)
PASS
复制代码

根据输出,我们可以确定测试通过了,将注释内容改为 // Output: Hello 再次执行测试。

=== RUN   ExampleHallo
--- FAIL: ExampleHallo (0.00s)
got:
Hallo
want:
Hello
FAIL
复制代码

测试函数包含以 “Output:” 开头的行注释,在运行测试时,Go 会将测试函数的输出和 “Output:” 注释中的值做比较,如果两个值不同等,则测试会执行失败并输出实际结果和 Output 注释中的值。

我们以 zulu.go 中的 Add 函数为例,新建一个 whiskey.go 文件。

// filename: zulu.go
func Add(x, y int) int {
   return x + y
}
复制代码
// filename: whiskey.go
func ExampleAdd() {
   res := Add(1, 2)
   fmt.Println(res)
   // Output: 5
}
复制代码

执行 whiskey.go 中的测试。

=== RUN   ExampleAdd
--- FAIL: ExampleAdd (0.00s)
got:
3
want:
5
FAIL
复制代码

要注意验证函数的命名一定要符合规范 ExampleXxx 且该函数没有任何参数。

如果输出顺序可能不确定,比如循环输出 map 的值,那么可以使用 “Unordered output:” 开头的注释来作为比较的结果。

三、嵌套测试 Subtest

testing.Ttesting.BRun 方法允许定义子单元测试和子基准测试,而不必为它们单独定义函数,并且这些子测试共享通用 setuptear-down 方法。

func TestXxx(t *testing.T) {
   t.Run("A=1", func(t *testing.T) {
      // 测试代码
   })
   t.Run("B=2", func(t *testing.T) {
      // 测试代码
   })
   t.Run("C=3", func(t *testing.T) {
      // 测试代码
   })
}
复制代码

image.png

执行时使用 -run 参数来执行运行的子测试

go test -run '' # 执行所有测试。
go test -run Xxx # 执行匹配 "Xxx" 的顶层测试,例如 "TestXxx"。
go test -run Xxx/A= # 对于匹配 "Xxx" 的顶层测试,执行其匹配 "A=" 的子测试。
go test -run /A=1 # 执行所有匹配 "A=1" 的子测试。



相关文章
|
1月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
39 4
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
38 1
|
1月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
42 7
|
1月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
1月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
1月前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
21 3
|
2月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
54 7
|
1月前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
15 2
|
1月前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
78 0
|
2月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。