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" 的子测试。



相关文章
|
8天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
8天前
|
SQL 开发框架 .NET
你确定不学?Go标准库之 text/template
你确定不学?Go标准库之 text/template
11 2
|
8天前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
18 1
|
8天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
94 1
|
8天前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
24 0
|
8天前
|
NoSQL Shell Go
在go中简单使用go-redis库
在go中简单使用go-redis库
|
8天前
|
数据库连接 Go 数据库
【Go 语言专栏】Go 语言中的错误注入与防御编程
【4月更文挑战第30天】本文探讨了Go语言中的错误注入和防御编程。错误注入是故意引入错误以测试系统异常情况下的稳定性和容错性,包括模拟网络故障、数据库错误和手动触发错误。防御编程则强调编写代码时考虑并预防错误,确保程序面对异常时稳定运行。Go语言的错误处理机制包括多返回值和自定义错误类型。结合错误注入和防御编程,可以提升软件质量和可靠性,打造更健壮的系统。开发人员应重视这两方面,以实现更优质的软件产品。
|
8天前
|
网络协议 安全 Go
【Go语言专栏】Go语言中的WebSocket编程
【4月更文挑战第30天】本文介绍了在Go语言中使用WebSocket进行实时Web应用开发的方法。通过第三方包`gorilla/websocket`,开发者可建立WebSocket服务器和客户端。文中展示了如何创建服务器,升级HTTP连接,以及处理读写消息的示例代码。同时,客户端的创建和通信过程也得以阐述。文章还提及WebSocket的生命周期管理、性能与安全性考虑,以及实践中的最佳做法。通过学习,读者将能运用Go语言构建高效、实时的Web应用。
|
8天前
|
算法 Java Go
【Go语言专栏】Go语言中的泛型编程探索
【4月更文挑战第30天】Go语言新引入的泛型编程支持使得代码更通用灵活。通过类型参数在函数和接口定义中实现泛型,如示例中的泛型函数`Swap`和泛型接口`Comparator`。泛型应用包括数据结构、算法实现、函数包装和错误处理,提升代码复用与维护性。这一特性扩展了Go语言在云计算、微服务、区块链等领域的应用潜力。
|
8天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
30 1