假设我为测试设置了一个带有数据库的Docker容器,并在testing.TestMain中进行了此操作,因为我希望在全球范围内一次完成此操作。我在此defer
中写了一条testing.Main()
语句来进行清理(即,删除数据库容器)。
现在,假设出了点问题,我的测试出现了紧急情况。 This issue告诉我,我无法编写自定义recover
代码来确保已删除容器。的确是这样:testing.M.Run()
进行了自己的recover()
调用,而且似乎无法覆盖其行为。
问题是:无论如何我该怎么做以确保执行清理代码?
答案 0 :(得分:1)
如您所链接的问题中所述:
恐慌可能来自通过测试启动的goroutine, 测试包不能为这些goroutine添加延迟以捕获 恐慌。
此外,某些恐慌无法恢复,例如在......之外 内存或运行时内存损坏。
简而言之,您不能确保在任何情况下都可以执行任何代码。
如果清理不是很关键,则可以在清理之前和之后进行(例如,在测试开始时,请先检查容器是否存在并销毁它,然后再创建一个新容器,然后尽最大努力销毁它)在末尾)。如果清理非常关键,请用一些东西(例如shell脚本或makefile)包装go test
调用,然后让包装器负责外部依赖项的建立和拆除。