【问题标题】:How can I force Karma to restart the browser in between each test?如何强制 Karma 在每次测试之间重新启动浏览器?
【发布时间】:2018-03-13 14:00:09
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 这样一种情况是,当您的测试代码使用customElements.define(...) 注册自定义元素时。由于没有 undefine,所以测试无法清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2011-12-01
    • 2012-01-11
    相关资源
    最近更新 更多