【问题标题】:Karma unit tests run over and over again in an infinite loopKarma 单元测试在无限循环中一遍又一遍地运行
【发布时间】:2016-10-07 11:52:14
【问题描述】:

我遇到了这个问题,因为我创建了一堆新的指令测试(在 JHipster 项目中)。业力单元测试由 grunt 任务执行。 我想清楚地强调我的问题与我在 GitHub 上发现的这两个(以及一些我不允许发布的其他问题)不同:

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

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

不同之处在于,karma 永远不会执行完测试,而是会一直循环运行它们,就好像在配置的位置有无限数量的测试一样。在命令行输出中可以很清楚的看到:


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...),测试都将永远运行(所有测试都通过这里,如您所见)。仅当我在命令行中停止 grunt 任务时才会停止执行。

Karma 配置和 grunt 任务在过去几个月没有改变。 Singlerun 和 autowatch 设置(以及任何其他设置)无关紧要。

被测代码似乎无关紧要。一些更改,他们使问题消失了一段时间,但是当我编写新测试时,它总是会回来。当然一开始我还以为是我的代码惹的祸,但下面会说明为什么这不是一个合乎逻辑的结论。

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

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

我还认为可能是内存限制问题,因为有一段时间,浏览器在某个与新功能或新测试无关的测试中崩溃(并且几个月来一直运行良好)。当我关闭该测试时,问题停止了一段时间,但后来又出现了(因为我一直在编写测试)。

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

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

【问题讨论】:

  • 今天我们开始发生同样的事情 - 我想知道是否有释放 karma/jasmine/someOtherDependency 可能导致这种情况?
  • 一定是巧合,我们同时遇到了同样的问题!请参阅下面的答案,了解我们如何解决此问题。
  • FWIW,我在 Angular 6 中遇到了同样的问题。错误的测试是一个对话框打开。到目前为止,我们只是摆脱了这个测试,但它并没有解释死循环的根本原因......

标签: angularjs karma-runner


【解决方案1】:

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

在模拟/监视此调用后,循环行为停止。

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

【讨论】:

  • 谢谢,这完全有帮助。有一堆代码和平测试使浏览器下载资源:$window.location = "..."。监视这些电话解决了这个问题。唯一一直困扰我的是我设法停止循环几次,但当我编写新测试时它又回来了。您是否认为重定向会导致一些内存泄漏或类似情况,从而导致每次测试时内存消耗异常?如果是这种情况,我相信模拟重定向可以永久解决问题。否则我担心循环会再次出现。
  • 我认为这种行为是因为重定向需要一些时间来处理,所以你添加的在重定向之后执行的测试越多,你给重定向处理的时间就越多,然后循环开始。理论上,如果重定向发生在 karma 运行中执行的最后一个测试中,那么您将看不到循环,因为 karma 运行将在重定向发生之前终止。
  • 谢谢!我非常喜欢它:)
  • 这对我有很大帮助,因为我遇到了同样的问题。导致我所有测试不断重新运行的另一件事是对“window.location.reload();”的一次调用。在我的一个组件中。
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多