如何用 ginkgo/gomega 测试无限 loop/recursion?
How to test for infinite loop/recursion with ginkgo/gomega?
我有一个 golang 函数,它递归地遍历 json 字符串并将自定义引用替换为它们引用的 json 文档。我刚刚注意到我忘记处理循环引用,它的出现会导致无限递归。
在我解决这个问题之前,我想为这个案例编写一个测试(使用 ginkgo/gomega),这样我就可以验证我的解决方案是否有效,如果我打破它并且 运行 进入这个我会注意到又出问题了
但是我该如何做 if this function call does not return within <timeout>, abort it and fail the test
之类的事情?
Gomega 的 Eventually
有一个超时,但是如果它已经 运行ning 它不会中止函数,所以在这种情况下它会永远阻塞。
我发现 this example 如何使用 select
和通道检查超时,但据我了解,不可能从外部终止 goroutine - 所以我的功能将继续在后台运行,占用资源?
检查无限递归的最佳方法是什么?
您不能中止 运行 函数。该函数必须支持堕胎,惯用地通过 context.Context
or a channel. If you want to support timeout or abortion, you have to change / refactor your function. And the function itself has to support this, e.g. it has to monitor the context.Context
and return early if cancellation was requested. For details and example, see
查看相关内容:
我有一个 golang 函数,它递归地遍历 json 字符串并将自定义引用替换为它们引用的 json 文档。我刚刚注意到我忘记处理循环引用,它的出现会导致无限递归。 在我解决这个问题之前,我想为这个案例编写一个测试(使用 ginkgo/gomega),这样我就可以验证我的解决方案是否有效,如果我打破它并且 运行 进入这个我会注意到又出问题了
但是我该如何做 if this function call does not return within <timeout>, abort it and fail the test
之类的事情?
Gomega 的 Eventually
有一个超时,但是如果它已经 运行ning 它不会中止函数,所以在这种情况下它会永远阻塞。
我发现 this example 如何使用 select
和通道检查超时,但据我了解,不可能从外部终止 goroutine - 所以我的功能将继续在后台运行,占用资源?
检查无限递归的最佳方法是什么?
您不能中止 运行 函数。该函数必须支持堕胎,惯用地通过 context.Context
or a channel. If you want to support timeout or abortion, you have to change / refactor your function. And the function itself has to support this, e.g. it has to monitor the context.Context
and return early if cancellation was requested. For details and example, see
查看相关内容: