我目前正在考虑如何编写测试,以检查给定的代码是否发生了 panic ?我知道Go使用 recover 来捕获紧急情况,但是与说Java代码不同,您不能真正指定在发生紧急情况时应该跳过哪些代码或有什么问题。因此,如果我有一个功能:

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 ?

最佳答案

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/31595791/

10-12 04:42