我有一组Jasmine单元测试,我在构建服务器上运行。我设法让Karma很好地工作,这样每次推送到我的开发分支时,我的测试都会自动在Chrome,Edge和Firefox上运行。
但是,我担心我的测试不是独立的,因为大多数浏览器状态(例如全局JS,DOM和本地存储)在测试之间都存在。在某些情况下,我发现这允许测试通过以前测试的操作,这对我来说感觉就像是不好的做法。我想做的是强制浏览器在每次测试之间重新启动,从而创建一个新的独立测试环境。这可能吗?
答案 0 :(得分:2)
我不认为Karma支持在测试之间重新启动浏览器。需要克服多个障碍:
为了做你想做的事,Karma必须在完成一次测试后保存测试运行器的状态,重新启动浏览器,然后以允许的方式在新浏览器中调用测试运行器它知道下一个测试。 AFAIK,Karma没有这方面的机器。我对Jasmine并不是很熟悉,但我也不认为它支持Jasmine。
它会破坏设置和拆除代码的语义。如果您使用beforeAll
挂钩,那么测试运行器在浏览器的第二个实例中运行测试时应该做什么?
一个。它不会再次运行beforeAll
。例如,如果它负责通过添加元素来初始化DOM,那么这个初始化就不会完成。这不可行。
B中。它再次运行beforeAll
,有效地将其转换为beforeEach
。这是否会导致问题取决于您的项目。有些代码放在beforeAll
而不是beforeEach
中,因为运行起来相当昂贵,将beforeAll
转换为beforeEach
可能会非常昂贵。
仍然存在重新启动浏览器的问题, in and their of this ,这是一项代价高昂的操作,并会大大降低该套件的速度。
我遇到了一些我喜欢新浏览器的情况。我通过以下方式解决了这个问题:
在iframe
中加载测试中的代码。这会创建一个新的Window
对象,以便您可以隔离Window
- 特定数据。例如,我使用此功能来测试使用onerror
或onbeforeunload
混乱的代码。
我已经使用DOM提供的API来清理我的测试。例如,通过在测试之间清除localStorage
,我确保使用localStorage
测试代码的测试不会受到其他测试的影响。
我还没遇到没有解决方案而启动新浏览器实例的情况。