gpt4 book ai didi

testing - 如何测试 panic ?

转载 作者:IT王子 更新时间:2023-10-29 01:48:04 26 4
gpt4 key购买 nike

我目前正在考虑如何编写测试来检查给定的代码段是否出现 panic?我知道 Go 使用 recover捕捉 panic ,但与 Java 代码不同,您无法真正指定在 panic 或您有什么情况下应跳过哪些代码。所以如果我有一个函数:

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 发生 panic 后我们恢复了,还是该函数根本没有发生 panic 。如何指定在没有 panic 时跳过哪些代码以及在出现 panic 时执行哪些代码?我如何检查我们是否从 panic 中恢复过来?

最佳答案

testing 并没有真正的“成功”概念,只有失败。所以你上面的代码是正确的。您可能会发现这种风格稍微清晰一些,但它基本上是一回事。

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

// The following is the code under test
OtherFunctionThatPanics()
}

我通常发现 testing 相当薄弱。您可能对更强大的测试引擎感兴趣,例如 Ginkgo .即使你不想要完整的 Ginkgo 系统,你也可以只使用它的匹配器库,Gomega ,它可以与 testing 一起使用。 Gomega 包括如下匹配器:

Expect(OtherFunctionThatPanics).To(Panic())

您还可以将 panic 检查封装到一个简单的函数中:

func TestPanic(t *testing.T) {
assertPanic(t, OtherFunctionThatPanics)
}

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

关于testing - 如何测试 panic ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com