去测试:惊恐后清理

时间:2018-08-07 13:27:12

标签: testing go

假设我为测试设置了一个带有数据库的Docker容器,并在testing.TestMain中进行了此操作,因为我希望在全球范围内一次完成此操作。我在此defer中写了一条testing.Main()语句来进行清理(即,删除数据库容器)。

现在,假设出了点问题,我的测试出现了紧急情况。 This issue告诉我,我无法编写自定义recover代码来确保已删除容器。的确是这样:testing.M.Run()进行了自己的recover()调用,而且似乎无法覆盖其行为。

问题是:无论如何我该怎么做以确保执行清理代码?

1 个答案:

答案 0 :(得分:1)

如您所链接的问题中所述:

  

恐慌可能来自通过测试启动的goroutine,   测试包不能为这些goroutine添加延迟以捕获   恐慌。

     

此外,某些恐慌无法恢复,例如在......之外   内存或运行时内存损坏。

简而言之,您不能确保在任何情况下都可以执行任何代码。

如果清理不是很关键,则可以在清理之前和之后进行(例如,在测试开始时,请先检查容器是否存在并销毁它,然后再创建一个新容器,然后尽最大努力销毁它)在末尾)。如果清理非常关键,请用一些东西(例如shell脚本或makefile)包装go test调用,然后让包装器负责外部依赖项的建立和拆除。