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

时间:2017-10-02 13:32:32

标签: javascript unit-testing karma-runner karma-jasmine

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

  3. 仍然存在重新启动浏览器的问题, in and their of this ,这是一项代价高昂的操作,并会大大降低该套件的速度。

    我遇到了一些我喜欢新浏览器的情况。我通过以下方式解决了这个问题:

    1. iframe中加载测试中的代码。这会创建一个新的Window对象,以便您可以隔离Window - 特定数据。例如,我使用此功能来测试使用onerroronbeforeunload混乱的代码。

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

    3. 我还没遇到没有解决方案启动新浏览器实例的情况。