Jest无限挂起,未运行任何测试。

54

每次我运行jest时,它都不会执行任何操作。我已经让计数器任意增高了。我已经使用--no-cache选项运行了jest。

jest --debug 输出如下:

{
  "configs": [
    {
      "automock": false,
      "browser": false,
      "cache": true,
      "cacheDirectory": "/var/folders/7v/64n1tsk11zs2pbwf5bm_c9kc0000gn/T/jest_dx",
      "clearMocks": false,
      "coveragePathIgnorePatterns": [
        "/node_modules/"
      ],
      "detectLeaks": false,
      "forceCoverageMatch": [],
      "globals": {},
      "haste": {
        "defaultPlatform": "ios",
        "platforms": [
          "android",
          "ios",
          "native"
        ],
        "providesModuleNodeModules": [
          "react-native"
        ]
      },
      "moduleDirectories": [
        "node_modules"
      ],
      "moduleFileExtensions": [
        "js",
        "json",
        "jsx",
        "node"
      ],
      "moduleNameMapper": [
        [
          "^React$",
          "/Users/skilurus/github/flock-react-app/node_modules/react"
        ]
      ],
      "modulePathIgnorePatterns": [
        "/Users/skilurus/github/flock-react-app/node_modules/react-native/Libraries/react-native/"
      ],
      "name": "b29a126b130a0be47202d3bc7b00f1b4",
      "resetMocks": false,
      "resetModules": false,
      "restoreMocks": false,
      "rootDir": "/Users/skilurus/github/flock-react-app",
      "roots": [
        "/Users/skilurus/github/flock-react-app"
      ],
      "runner": "jest-runner",
      "setupFiles": [
        "/Users/skilurus/github/flock-react-app/node_modules/regenerator-runtime/runtime.js",
        "/Users/skilurus/github/flock-react-app/node_modules/react-native/jest/setup.js",
        "/Users/skilurus/github/flock-react-app/test-setup.js"
      ],
      "snapshotSerializers": [
        "/Users/skilurus/github/flock-react-app/node_modules/enzyme-to-json/serializer.js"
      ],
      "testEnvironment": "/Users/skilurus/github/flock-react-app/node_modules/jest-environment-jsdom/build/index.js",
      "testEnvironmentOptions": {},
      "testLocationInResults": false,
      "testMatch": [
        "**/__tests__/**/*.js?(x)",
        "**/?(*.)(spec|test).js?(x)"
      ],
      "testPathIgnorePatterns": [
        "/node_modules/",
        "e2e"
      ],
      "testRegex": "",
      "testRunner": "/Users/skilurus/github/flock-react-app/node_modules/jest-jasmine2/build/index.js",
      "testURL": "about:blank",
      "timers": "real",
      "transform": [
        [
          "^.+\\.js$",
          "/Users/skilurus/github/flock-react-app/node_modules/babel-jest/build/index.js"
        ],
        [
          "^[./a-zA-Z0-9$_-]+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$",
          "/Users/skilurus/github/flock-react-app/node_modules/react-native/jest/assetFileTransformer.js"
        ]
      ],
      "transformIgnorePatterns": [
        "node_modules/(?!react-native|native-base|react-navigation|react-native-fabric|tipsi-stripe)"
      ],
      "watchPathIgnorePatterns": []
    }
  ],
  "globalConfig": {
    "bail": false,
    "changedFilesWithAncestor": false,
    "collectCoverageFrom": [
      "src/**/*.{js,jsx}"
    ],
    "coverageDirectory": "/Users/skilurus/github/flock-react-app/__coverage__",
    "coverageReporters": [
      "json",
      "lcov",
      "text"
    ],
    "coverageThreshold": {
      "global": {
        "branches": 70,
        "functions": 75,
        "lines": 85,
        "statements": 80
      }
    },
    "detectLeaks": false,
    "expand": false,
    "globalSetup": null,
    "globalTeardown": null,
    "listTests": false,
    "mapCoverage": false,
    "maxWorkers": 7,
    "noStackTrace": false,
    "nonFlagArgs": [],
    "notify": false,
    "notifyMode": "always",
    "passWithNoTests": false,
    "rootDir": "/Users/skilurus/github/flock-react-app",
    "runTestsByPath": false,
    "testFailureExitCode": 1,
    "testPathPattern": "",
    "testResultsProcessor": null,
    "updateSnapshot": "new",
    "useStderr": false,
    "verbose": true,
    "watch": false,
    "watchman": true
  },
  "version": "22.3.0"
}

node --version:8.9.4

npm --version:5.6.0

yarn --version:1.3.2

有人遇到过类似的问题吗?有人知道如何修复吗?


你解决了这个问题吗? - Amrendra
可能是的,但我不知道或记得它是什么。我没有在此处撰写答案的事实表明,我从未真正弄清楚如何修复它,而某些随机咒语为我解决了特定实例的问题。 - Abraham P
我通过更改Node版本来修复了它。 - Amrendra
你的测试启动了7个工作进程,因此很难确定哪一个进程出现了无限循环。使用 --runInBand 命令行选项可以让测试按顺序运行,这对于开始测试是非常有帮助的。由于在经过了163秒后仍然没有任何反应,你需要找出导致无限循环的测试用例。 - Șerban Ghiță
19个回答

29

我也遇到了这个问题,不过它是间歇性的,非常令人沮丧。我发现一个解决方法,就是使用 --runInBand 标志运行,这只会在同一个线程中运行测试:


jest --runInBand

28
运行你的测试就像这样:
jest --detectOpenHandles --forceExit 

--detectOpenHandles会记录下导致测试无法正常退出的错误,并且它还会隐含使用--runInBand,确保测试在同一线程中运行,避免重叠。 --forceExit会在出现问题时终止测试,而不是让其挂起。


这个与最佳答案 jest --clearCache(首先运行此清除缓存命令)相结合,效果非常好,谢谢。 - KayakinKoder
2
根据文档--detectOpenHandles 意味着 --runInBand - Martin van Driel

19

记录一下,对于我的情况,最终发现是缓存问题(在此之前我尝试了很多其他方法)。

对于jest的版本>=22.0.0,请使用--clearCache选项清除缓存。

对于jest的版本<22.0.0,请使用--showConfig选项,查找cacheDirectory属性并删除提到的目录。

希望这能帮助到某些人。


1
在我们的CI/CD中似乎最有效的方法是首先运行jest --clearCache,然后再运行以下其中一个答案:jest --runInBand --detectOpenHandles --forceExit。我们在Linux Docker机器上的测试时间从1分钟缩短到不到10秒,并且不再出现任何挂起情况。 - KayakinKoder

12
在 MacOS 上,卸载并重新安装 watchman 对我来说没有用。运行 watchman version 会无限期地挂起。
要修复 watchman 挂起的问题,请执行以下操作:
launchctl unload ~/Library/LaunchAgents/com.github.facebook.watchman.plist
watchman version

https://github.com/facebook/watchman/issues/381#issuecomment-257673900

当您看到类似下面的内容时,就知道它已经起作用了:
{
    "version": "2021.08.23.00"
}

然后重新运行你的Jest测试


1
我在想你是否还记得,你是怎么知道它与watchman有关的? - Matei Iorgulescu
1
@MateiIorgulescu,我认为是因为我有两台MacBook,其中一台可以正常运行测试,而另一台不行。它们都具有相同的Node和Node模块。唯一的区别在于,在其中一台上,Watchman版本不同。 - Zhong Huiwen
1
这对我很有帮助,谢谢! - Ray Oei
这是我的问题:watchman在Mac Book Pro M1上挂起;node@18 jest@29.3.1 - jhohlfeld

7
在 MacOS 上,我通过使用 brew uninstall watchman 卸载并重新安装 watchman,解决了这个问题。最近升级了操作系统,可能与此有关。

5

我遇到了类似的问题。我的大多数测试都运行正常,但有一个套件一直在运行,从未报错。

后来发现,我的某个 useEffect 存在竞态条件,导致 jest 一直在运行。

为了诊断这个问题:

将所有测试进行注释,只保留一个测试。持续添加测试,直到找到触发错误的测试。

分析测试以确定哪些代码受到影响(我的问题最终是出现在 UseEffect 中)。

确定是哪个 state 对象导致了竞态条件。

修复方法:删除该对象或添加条件检查以防止竞态条件的发生。


不必注释掉所有其他测试,您可以将 ittestdescribe 替换为 it.onlytest.onlydescribe.only,以仅运行套件中的该测试(或一组测试)。或者,反之亦然,将 only 替换为 skip,以跳过单个测试。 - JamieGL
1
由于它是临时的,所以我可以选择并快速注释,而不是查找和替换。这是一个节省时间的方法。 - Centerwork
你只需要将想要运行的单个测试中的 test 改为 test.only,它就会自动跳过其余的测试。因此,在整个文件中只需要进行一行更改,无需触及任何其他测试。 - JamieGL
谢谢,将 useEffect 注释掉使其通过。现在必须弄清楚为什么会发生这种情况。在我的情况下,useEffect 从 'react-hook-form' 使用表单中调用了 reset() - wviana

2

在组件中使用 useEffect 钩子时会出现无限循环问题,导致 jest 无法完成测试。因此需要进行调试。


2

我遇到了相同的问题,测试通过后程序却停止运行,连CI也停止了。我偶然发现了--forceExit,使用它解决了问题。


2
所以我遇到了类似的情况,只是jest拒绝运行我的所有测试!原因有点复杂: 我已经超过6个月没有运行这个项目了,各种依赖关系已经出现了漏洞问题。 当我最后一次运行项目和测试时,我使用全局配置安装了jest。 然后在某个时候,我从全局卸载了jest(因此失去了全局配置),但没有记得为我谈论的项目添加本地配置。

当我调试以尝试运行测试时,我清除了我的节点模块并进行了新的安装。

只有在添加了一个设置了无缓存选项的jest.config后,它最终才能正常工作。

总之:

  • 如果您没有全局安装jest,请确保为您的项目设置了jest配置。
  • 在使用cli设置配置后,请返回并手动检查您选择的所有选项是否存在,并修改cli未提示的选项。

2

在我的情况下,是因为我在VS Code中使用了一个Jest插件,并启用了自动保存功能。因此,在运行太多次后,Jest挂起了。

删除 /tmp/jest_rs 解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接