首页 > 后端开发 > Golang > 如何有效测试 Go 中的恐慌?

如何有效测试 Go 中的恐慌?

Susan Sarandon
发布: 2024-12-05 15:19:09
原创
449 人浏览过

How Can I Effectively Test for Panics in Go?

在 Go 中测试恐慌

在 Go 中编写测试时,检查恐慌可能是一种有用的技术。然而,与 Java 不同,Go 没有明确的语法来选择性地处理恐慌。

考虑以下示例:

func f(t *testing.T) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    OtherFunctionThatPanics()
    t.Errorf("The code did not panic")
}
登录后复制

此代码尝试使用恢复函数从 OtherFunctionThatPanics 中的任何恐慌中恢复。然而,确定函数是否发生恐慌或是否没有发生恐慌可能具有挑战性。

解决方案

建议的方法是专注于测试是否存在恐慌的恐慌。这可以通过反转逻辑并确保在预期的情况下发生恐慌来实现:

func TestPanic(t *testing.T) {
    defer func() {
        if r := recover(); r == nil {
            t.Errorf("The code did not panic")
        }
    }()

    // Code under test
    OtherFunctionThatPanics()
}
登录后复制

此外,更高级的测试框架(例如 Ginkgo 或 Gomega)提供内置匹配器来断言恐慌的发生:

Expect(OtherFunctionThatPanics).To(Panic())
登录后复制

实用函数

对于为了方便起见,您可以创建一个通用函数来断言恐慌:

func assertPanic(t *testing.T, f func()) {
    defer func() {
        if r := recover(); r == nil {
            t.Errorf("The code did not panic")
        }
    }()
    f()
}
登录后复制

此函数可以按如下方式使用:

func TestPanic(t *testing.T) {
    assertPanic(t, OtherFunctionThatPanics)
}
登录后复制

以上是如何有效测试 Go 中的恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板