一个不受欢迎的测试如何影响Go中的另一个?

时间:2017-09-22 08:43:41

标签: testing go

我在https://github.com/VertebrateResequencing/wr/blob/develop/jobqueue/jobqueue_test.go中有一个测试函数TestJobqueue(),我可以单独调用它:go test -tags netgo ./jobqueue -v -run 'TestJobqueue$'

我最近开始得到与boltdb(我的一个依赖项)相关的测试失败,并且在signal SIGBUS: bus error code恐慌中爆炸,或者通常是因为数据库无法打开而导致测试失败。但只有在处理NFS安装目录时才会这样做。很公平,我或boltdb有一些与NFS有关的错误。

但是我无法解决的问题是,当存在完全不同的测试函数时,我只能得到这些错误。

根据https://github.com/VertebrateResequencing/wr/blob/92fb61ccd7819c8f1edfa8cce8468c4250d40ea7/jobqueue/rest_test.goTestREST()中的评论,如果我调用Serve(serverConfig)(正在测试的包中的函数,则在{{1}中多次进行函数调用和该测试函数中的其他测试函数TestJobqueue()失败。如果我不这样做,那就没有了。

简而言之,一个测试函数中的测试失败可以通过我没有运行的测试函数中的布尔值来控制。

这怎么可能?

编辑:为了解决第一个答案提出的一些问题,TestJobqueue()正在孤立地运行。在其之前或之后没有其他测试运行。如果数据库文件已存在,TestJobqueue()将导致首先删除这些文件,然后创建一个新文件以运行新的测试集。我寻求答案的奇怪之处在于未执行的功能如何产生这种副作用。我可以通过Serve()调用开始或结束TestREST()来证明它真的没有执行:从未见过恐慌的输出,但panic失败仍然可以通过{中的布尔值来控制{1}}(如果恐慌结束)。

Edit2:原来这是由我在TestJobqueue()中做的一件不寻常的事情引起的,即在TestREST()上调用TestJobqueue()。毋庸置疑,如果你这样做,可能会发生奇怪的事情......

1 个答案:

答案 0 :(得分:1)

简而言之,一个测试函数中的测试失败可以通过我未运行的测试函数中的布尔值来控制。

这不是一个很好的总结。您的测试启动服务器。另一个测试启动服务器,显然问题就在那里。您似乎已注释掉在测试结束时停止服务器的代码位?您无法在同一端口上运行两台服务器。

您可能有一个端口冲突或一次运行两个服务器触发的网络状况,因为它们似乎都使用类似的(相同的?)配置加载如下:

config := internal.ConfigLoad("development", true)

使用无配置运行使用默认值,避免冲突,使用配置运行会导致冲突。因此,要将其固定下来,请尝试一次创建一个设置,直到找到导致问题的配置设置(很可能是端口或WebPort)。或者,确保测试在结束时停止服务器。

[编辑]看起来您已经通过一次更改一个来缩小到DBFile配置设置。这意味着服务器启动一个新的数据库实例 - 如果两者都试图为新数据库使用相同的文件,这将导致争用,第二个测试运行将失败。

从您上面的描述中不完全清楚您正在做什么或问题是什么,因此您可以尝试改进它以准确说明操作顺序和问题。例如,如果您之前运行过创建数据库的测试,则由于存在db文件,可能会影响以后的测试运行,因此您的测试不是完全独立的。

[编辑2 - 进一步编辑后提问] 如果注释掉TestREST可以完全解决你的问题(或者在启动之前出现恐慌),并且如果更改它会破坏另一个测试,那么你将以某种方式执行TestREST。

查看jobqueue_test的代码,它似乎调用了go测试,因此您可能正在运行更多的测试?鉴于你没有看到恐慌输出,我怀疑你在这个重大测试中使用了exec.Command。尝试删除失败测试的位,直到它确切地缩小正在运行另一个测试的调用。在测试中调用测试是非常不寻常的!

https://github.com/VertebrateResequencing/wr/blob/develop/jobqueue/jobqueue_test.go#L2445