我目前正在考虑如何编写测试,以检查给定的代码是否发生了 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/