如何强制 Karma 在每次测试之间重新启动浏览器?

dev*_*obf 5 javascript unit-testing karma-runner karma-jasmine

我有一组在构建服务器上运行的 Jasmine 单元测试。我设法让 Karma 很好地工作,这样每次我推送到我的开发分支时,我的测试都会自动在 Chrome、Edge 和 Firefox 上运行。

然而,我担心我的测试不是独立的,因为大部分浏览器状态(例如全局 JS、DOM 和本地存储)在测试之间仍然存在。在某些情况下,我发现这允许由于先前测试的操作而使测试通过,对我来说这感觉是不好的做法。我想做的是强制浏览器在每次测试之间重新启动,从而创建一个新的、独立的测试环境。这可能吗?

Lou*_*uis 3

我认为 Karma 不支持在测试之间重新启动浏览器。将有多个障碍需要克服:

  1. 为了执行您想要的操作,Karma 必须在完成一个测试后保存测试运行器的状态,重新启动浏览器,然后在新浏览器中调用测试运行器,以允许它知道哪个测试是下一个。AFAIK,Karma 没有这方面的机制。我对 Jasmine 不太熟悉,但我认为它也不支持这一点。

  2. 它会混淆设置和拆卸代码的语义。如果您使用beforeAll钩子,那么测试运行器在浏览器的第二个实例中运行测试时应该做什么?

    A. 它不会beforeAll再次运行。例如,如果它负责通过添加元素来初始化 DOM,则该初始化不会完成。那是不可行的。

    B. 它运行beforeAll再次,这有效地将其变成了beforeEach。这是否会导致问题取决于您的项目。有些代码被放入beforeAll而不是beforeEach因为运行起来相当昂贵,转换beforeAll成的beforeEach成本可能非常高。

而且仍然存在一个问题,即重新启动浏览器本身就是一项成本高昂的操作,并且会大大减慢套件的速度。

我曾经遇到过想要一个新的浏览器的情况。我已经通过以下方式解决了这个问题:

  1. 将被测试的代码加载到iframe. 这将创建一个新Window对象,以便您可以隔离Window特定数据。例如,我用它来测试与onerroror混淆的代码onbeforeunload

  2. 我已经使用 DOM 提供的 API 来在测试之间进行清理。例如,我localStorage通过在测试之间进行清除来确保测试代码使用的测试不会受到其他测试的影响localStorage

我还没有遇到过除了启动新的浏览器实例之外没有其他解决方案的情况。