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

How can I force Karma to restart the browser in between each test?

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

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

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

  1. 为了做你想做的事,Karma 必须在完成一个测试后 运行ner 保存测试状态,重新启动浏览器,然后调用测试 运行ner 在新浏览器中以一种允许它知道下一个测试的方式。 AFAIK,Karma 没有这方面的机器。我对 Jasmine 不是很熟悉,但我认为它也不支持这个。

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

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

    乙。它 运行 又是 beforeAll,这有效地将它变成了 beforeEach。这是否会导致问题取决于您的项目。一些代码被放入 beforeAll 而不是 beforeEach,因为 运行 相当昂贵,将 beforeAll 变成 beforeEach 可能非常昂贵。

还有一个问题是,重新启动浏览器 本身 是一项成本高昂的操作,并且会大大降低套件的速度。

我曾 运行 遇到过我希望使用全新浏览器的情况。我通过以下方式解决了这个问题:

  1. 正在 iframe 中加载被测代码。这会创建一个新的 Window 对象,因此您可以隔离 Window 特定的数据。例如,我用它来测试与 onerroronbeforeunload.

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

我还 运行 遇到 没有 解决方案 除了 启动新的浏览器实例。