使用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。
测试非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值是否符合预期,避免误捕或漏检。
以上就是如何测试Golang的panic行为 使用recover捕获预期异常的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1397916.html
微信扫一扫
支付宝扫一扫