【问题标题】:Jest - Simple tests are slow开玩笑 - 简单的测试很慢
【发布时间】:2017-12-18 14:43:20
【问题描述】:

我正在使用 Jest 测试一个 Angular 应用程序,运行简单测试需要很长时间,我似乎无法弄清楚原因。

package.json 中的我的 Jest 设置:

"jest": {
  "modulePaths": [
    "<rootDir>/src",
    "<rootDir>/node_modules"
  ],
  "testPathIgnorePatterns": [
    ".git/.*",
    "node_modules/.*"
  ],
  "transformIgnorePatterns": [
    "node_modules/.*",
    ".*\\.js"
  ],
  "setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.js",
  "preset": "jest-preset-angular",
  "testEnvironment": "jsdom",
  "testRegex": "src/app/.*\\.spec\\.ts$",
  "moduleFileExtensions": [
    "ts",
    "js",
    "json"
  ],
  "verbose": true,
  "cacheDirectory": ".jest-cache",
  "coveragePathIgnorePatterns": [
    ".*\\.(shim\\.ngstyle|ngfactory)\\.ts"
  ],
  "globals": {
    "ts-jest": {
      "tsConfigFile": "./tsconfig.json"
    },
    "__TRANSFORM_HTML__": true
  }
}

我的 Jest 设置文件:

'use strict';
require('core-js/es6/reflect');
require('core-js/es7/reflect');
require('zone.js');
require('zone.js/dist/proxy.js');
require('zone.js/dist/sync-test');
require('zone.js/dist/async-test');
require('zone.js/dist/fake-async-test');
require('jest-zone-patch');

const getTestBed = require('@angular/core/testing').getTestBed;
const BrowserDynamicTestingModule = require('@angular/platform-browser-dynamic/testing').BrowserDynamicTestingModule;
const platformBrowserDynamicTesting = require('@angular/platform-browser-dynamic/testing')  .platformBrowserDynamicTesting;

getTestBed().initTestEnvironment(
    BrowserDynamicTestingModule,
    platformBrowserDynamicTesting()
);

这是我的简单测试:

fdescribe('RichTextEditorComponent', () => {
  it('should be fast', () => {
    expect(true).toBeTruthy();
  });
});

有人知道为什么这需要 9 多秒吗?

【问题讨论】:

  • 使用 Windows 7 - 64bit / node 6.9.4 / npm 3.10.10
  • 你找到原因了吗?
  • @RClemens 是的 - 如果我没记错的话,这与 jest 本身在 Windows 机器上的速度较慢有关。
  • 可能与this issuethis issue 有关。如果您处于观看模式,禁用它可能会为您节省几秒钟的时间。显然,按顺序运行测试可以将某些 VM 的性能提高 50%。您可能也想尝试一下,添加 --runInBand 标志。
  • 我能找到的唯一与配置相关的原因是您使用的是setupTestFrameworkScriptFile,它在每个测试之前运行。您应该使用setupFiles 设置,它是一个字符串数组。其中一个字符串应该指向您的文件,它将为每个规范文件运行,而不是为每个测试运行。 jestjs.io/docs/en/configuration#setupfiles-array

标签: javascript angular typescript jestjs


【解决方案1】:

另一种可能是 ts-jest 很慢。有一个issue about that,并没有完全解决。

有各种workarounds discussed。它们由setting isolatedModules=true--maxWorkers=1 组成。即在jest.config.js

'use strict';

module.exports = {
    preset: 'ts-jest',
    testEnvironment: 'node',
    globals: {
        'ts-jest': {
            isolatedModules: true
        }
    },
}

然后运行

yarn test --maxWorkers=1

值得一试。或者,可以放弃 ts-jest 并使用 babel 转译。

【讨论】:

  • 使用 maxWorkers 效果很好,我的测试时间从 20 秒减少到大约 3 秒 :))
  • maxWorkers=1 是一个完美的解决方案
  • 在 Linux 机器上也进行了缓慢的测试。 isolatedModules 是关键。未设置maxWorkers=1
  • isolatedModules 导致集成测试出错,maxWorkers 改为有效。
【解决方案2】:

阅读这两个链接:

https://itnext.io/how-to-make-your-sluggish-jest-v23-tests-go-faster-1d4f3388bcdd https://github.com/facebook/jest/issues/7963

这里列出了需要考虑的事项。它们并非针对您的情况,但由于问题的标题很笼统,我认为它们可能会帮助一定比例的访问者。不应盲目尝试,它们只是研究的起点。

尝试加快你的笑话测试的事情:

  1. 使用--watch在监视模式下运行

    当您使用 --watch 时,jest 会进行优化。

  2. 在您的主机上而不是在 docker 上运行? -> 之前用docker exec -it &lt;containername&gt; yarn test,改用host后发现更快了。

  3. 升级jest版本 似乎有一些错误使某些版本变慢 https://github.com/facebook/jest/pull/8046

    注意:yarn upgrade 遵循 ~ 和 ^ 版本符号, 如果您知道自己在做什么,您可能只想删除并重新添加 yarn remove jest yarn add -D jest 这将为您提供最新的

  4. 将测试环境从jsdom改为node

"jest": {
  "testEnvironment": "node"
}
  1. 同步运行测试.. 允许 jest 优化?

添加--runInBand选项

  1. 设置最大工作数可能会使其更快?

添加--maxWorkers=4 选项

在我的例子中,我升级了 jest 版本,开始使用 --watch 和 --runInBand 并在我的主机上而不是通过 docker 运行,我的测试时间从 2 分钟变为 10 秒。我不知道我的问题到底是什么。

【讨论】:

  • testEnvironment 更改为node 大大减少了启动时间
  • 观看模式对我来说超级慢,但添加 --runInBand 修复了它。之前初始化工作池似乎需要大约 20 秒?我的测试套件很小,所以我真的不需要并行化。
  • --runInBand 和 --maxWorkers 放在一起没有意义。
  • --runInBand 为我修复了它。
  • 设置 testEnvironment: node 破坏了我所有的测试,因为 window 未定义,runInBand 似乎只在有一些测试时提供改进,但在运行 300 个套件时会大大减慢速度。 maxWorkers 如果您在一个容器中运行,该容器报告的 CPU 比您实际拥有的 CPU 多,但在我的情况下似乎没有做太多,那么maxWorkers 会很有用。
【解决方案3】:

我认为答案最终需要来自 Angular 团队。 platformBrowserDynamicTesting 的文档很少 (https://angular.io/api/platform-browser-dynamic/testing/platformBrowserDynamicTesting)。

也许 platformBrowserDynamicTesting 模拟浏览器并将应用程序的整个 DOM 加载到内存中。在这种情况下,Angular 应用程序(没有任何缓存的 JavaScript)几乎 10 秒的加速似乎是合理的。也许我解释错了,但是根据您的报告,实际测试似乎在 6 毫秒内运行,这似乎应该满足您对“快速测试”的要求。如果您添加另一个简单的“应该很快 2”测试,我很想知道测试需要多长时间。如果总时间仍低于 10 秒,则表明与 Angular platformBrowserDynamicTesting 实用程序的加速相比,您的实际测试花费的时间非常短。

【讨论】:

    【解决方案4】:

    我还在我的 Angular 项目中使用 Jest,但我不确定这是一个好的解决方案。

    配置测试模块时,可以使用NO_ERRORS_SCHEMA,而不必在declarations中添加所有嵌套组件来编译要测试的组件。

    beforeEach(async () => {
        return TestBed.configureTestingModule({
          declarations: [
            MyComponent
          ],
          schemas: [NO_ERRORS_SCHEMA]
        }).compileComponents();
      });
    

    您使用 Jest 进行的测试是单元测试,因此使用该解决方案,您将只测试您的组件。 如果您想测试组件之间的交互,您将使用 Protractor 或 Puppeteer 进行端到端测试。

    【讨论】:

      【解决方案5】:

      如果有人遇到 jest 测试套件执行缓慢的问题,请将版本升级到 25 或更高版本。 Jest 版本 24 运行缓慢。

      https://jestjs.io/blog/2020/01/21/jest-25#performance-improvements[jest-25#performance-improvements][1]

      【讨论】:

        【解决方案6】:

        我通过全局安装 jest 解决了同样的问题

        npm install -g jest@26.0
        

        这是一些相同项目和相同测试用例的基准测试结果

        本地 - win10 2004 版本 ----------------- -- node-14.7.0 -- 11.847 秒

        全局 - win10 2004 版本 ----------------- -- node-14.7.0 -- 0.907 s

        global - win10 版本 2004 -- wsl/ubuntu-18.04 -- node-14.7.0 -- 0.469 s

        【讨论】:

        • 对我来说没什么区别(Windows 上的文件,在 git-bash 中执行的笑话)。您在哪里运行测试以及源文件存储在哪里?在 Windows 上,还是在 WSL 中?
        • 今天我用的是windows10 + WSL2-ubuntu,速度还可以。测试文件位于 windows 分区中。我认为使用 nvm 之类的工具或在本地运行 jest 可能是原因。但我没有确凿的证据。
        • 虽然这个答案有多个反对意见,但我已经投了赞成票。情况正是如此。 WSL2 一直(官方)建议,与从 Linux VM 访问 Windows 文件系统相比,访问 Linux 文件系统中的文件将具有更好的性能。这可能是的一个例子。但在某种程度上它没有意义,因为即使全局安装 jest 也会将其二进制文件添加到 Linux 文件系统(在我的例子中是 /usr/bin/jest),但无论出于何种原因,它的运行速度都快了 10 倍。 它的要点: 为了将它与 npm 一起使用,请使用:"test": "/usr/bin/jest",
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 2018-09-10
        • 2020-02-06
        • 2020-03-25
        • 1970-01-01
        相关资源
        最近更新 更多