跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何测试Golang的panic行为 使用recover捕获预期异常

使用defer和recover捕获panic,通过测试验证函数在零输入时触发预期panic,非零输入时不panic,并可封装辅助函数assertPanic简化断言,确保异常处理正确。

在Go语言中,panic会中断正常流程,而recover可以捕获panic并恢复执行。测试panic行为的关键是验证函数是否在预期条件下触发panic,并能通过recover正确处理。以下是具体做法。

使用defer和recover捕获panic在测试中模拟调用可能panic的函数时,通过defer+recover结构捕获异常,判断是否如预期发生panic。

示例函数:

func divideByZero(x int) {if x == 0 {panic("division by zero")}}

对应的测试代码:

立即学习“go语言免费学习笔记(深入)

”;

func TestDivideByZero_PanicsWhenZero(t *testing.T) {defer func() {if r := recover(); r != nil {if msg, ok := r.(string); ok && msg == "division by zero" {// 符合预期return}t.Errorf("期望错误信息'division by zero',实际: %v", r)} else {t.Errorf("期望发生panic,但未发生")}}() divideByZero(0)}验证不应当panic的情况除了测试该panic时是否panic,还要确保在合法输入下不发生panic。

go语言参考手册 中文CHM版Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译下载

测试非panic路径:

func TestDivideByZero_DoesNotPanicWhenNonZero(t *testing.T) {defer func() {if r := recover(); r != nil {t.Errorf("不应当panic,但捕获到: %v", r)}}() divideByZero(5) // 正常调用}封装辅助函数简化测试如果多个测试需要类似逻辑,可封装一个工具函数判断是否发生预期panic。

func assertPanic(t *testing.T, f func(), expectedMsg string) {defer func() {if r := recover(); r == nil {t.Errorf("期望panic,但未发生")} else if msg, ok := r.(string); !ok || msg != expectedMsg {t.Errorf("期望消息 %q,实际 %v", expectedMsg, r)}}() f()}

使用方式:

func TestDivideByZero_UsingHelper(t *testing.T) {assertPanic(t, func() { divideByZero(0) }, "division by zero")}基本上就这些。通过defer+recover结构在测试中安全触发并捕获panic,既能验证异常路径,也能确保正常路径不受影响。关键是在recover中判断panic值是否符合预期,避免误捕或漏检。

相关文章