2016-06-07 150 views
8

由于我创建了一堆新的指令测试(在JHipster项目中),我正面临着这个问题。业力单位测试由一个咕task任务执行。 我想明确强调,我的问题是不同的这两个(和其他几个人我不允许张贴),我在GitHub上找到:Karma单元测试在无限循环中反复运行

https://github.com/karma-runner/karma/issues/1077

https://github.com/karma-runner/karma/issues/393

所不同的是那个业力永远不会执行测试,而是继续在循环中运行它们,就好像在配置的位置中有无数个测试一样。可以在命令行输出中清楚地看到:


Firefox 45.0.0 (Windows 7 0.0.0): Executed 321 of 192 (skipped 7) SUCCESS (0 secs/1 min 3.757 secs) 
Chrome 51.0.2704 (Windows 7 0.0.0): Executed 399 of 192 (skipped 11) SUCCESS (0 secs/1 min 2.239 secs) 
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 444 of 192 (skipped 11) SUCCESS (0 secs/1 min 0.515 secs) 

它会一直持续下去。执行经过近一个小时,这是结果:


Chrome 51.0.2704 (Windows 7 0.0.0): Executed 20171 of 192 (skipped 472) SUCCESS (0 secs/50 mins 7.281 secs) 
Firefox 45.0.0 (Windows 7 0.0.0): Executed 3186 of 192 (skipped 72) DISCONNECTED (14 mins 48.503 secs/12 mins 16.547 secs) 
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 27054 of 192 (skipped 611) DISCONNECTED (48 mins 25.253 secs/47 mins 34.776 secs) 

不要紧,测试是否通过或失败,或者他们为什么会失败(TypeError, ReferenceError...),测试永远无论运行(所有测试在这里,你可以看到)。只有当我停止命令行中的咕噜声时,执行才会停止。

过去几个月,噶玛配置和咕噜声任务没有改变。 Singlerun和autowatch设置(以及任何其他)是无关紧要的。

被测试的代码似乎是不相关的。一些变化,他们让问题消失了一段时间,但是当我写新的测试时,它总是回来。当然,我一开始以为我的代码是责任,但下面的内容会说明为什么它不是一个合乎逻辑的结论。

奇怪的行为总是在创建新测试时开始,但测试代码本身似乎是不相关的,因为新测试从不使用任何特殊操作或覆盖其他测试没有的组件。而且,即使新测试是一个完全空的函数体,它仍然会产生一种奇怪的行为,这表明它不是程序中的新决策路径,当测试覆盖时它会导致问题。这就是为什么我不相信代码是罪魁祸首。 我也设法通过关闭随机测试(我们很久以前没有任何问题使用)来停止无限执行,但是当我添加新测试时问题总是回来。

环境无关紧要。测试在我的Windows机器上和在Linux服务器上的CI上无限运行。

我也认为这可能是一个内存限制问题,因为一段时间,浏览器崩溃在某个测试上,与新功能或新测试无关(并且一直工作正常) 。当我关掉那个测试时,问题就停止了一段时间,但后来又回来了(因为我一直在写测试)。

我将所有NPM软件包和Bower组件更新到最新版本,但这并未改变无限循环。

现在我完全没有想法。有没有人遇到过这种奇怪的行为和控制台输出?

+0

今天同样的事情发生在我们身上 - 我想知道是否有释放业力/茉莉/ someOtherDependency可能导致这种情况? –

+0

一定是巧合,我们在同一时间有同样的问题!请参阅我的答案,了解我们如何解决这个问题 –

回答

5

我们刚刚解决了这个确切的问题。问题是我们在我们的应用程序中有一个注销功能,在将浏览器重定向到另一页之前执行各种任务。我们在注销功能中添加的一项测试并未嘲笑窗口。重定向调用,当它从业力测试运行中执行时,它会导致循环行为。

嘲笑/侦听此调用后,循环行为停止。

不确定这是否与您遇到的问题相同,但希望这些信息能帮助您!

+0

谢谢,这完全有帮助。 有一堆代码和平测试,使浏览器下载资源:'$ window.location =“...”'。侦察这些电话解决了这个问题。 唯一让我不安的是我设法停止了几次循环,但是当我写新的测试时它又回来了。你认为重定向会导致一些内存泄漏或类似的情况,导致每次测试都会导致内存消耗异常?如果是这种情况,我相信嘲笑重定向可以永久解决问题。否则恐怕循环会再次回来。 – user436357

+0

我认为这种行为是因为重定向需要一些时间来处理,所以在重定向后执行的测试越多,重定向到进程的时间越多,然后循环开始。理论上,如果重定向发生在业务运行中执行的最后一个测试上,那么你将看不到循环,因为在重定向发生之前业务运行将终止。 –

+0

P.S.如果你喜欢我的回答,请接受它:) –