【问题标题】:My Jests tests are leaking memory, how can I fix this?我的 Jests 测试正在泄漏内存,我该如何解决这个问题?
【发布时间】:2020-11-03 05:04:57
【问题描述】:

当我运行我的笑话测试时,每次测试使用的内存量会随着时间的推移而增加。这个问题在我的本地机器上并不明显;相反,我在 CircleCI 上运行测试时发现了这一点。我收到以下错误:

 FAIL  __tests__/pages/login.test.tsx
 
  ● Test suite failed to run
 
    jest: failed to cache transform results in: /tmp/jest_2ne/jest-transform-cache-7bdebd1a0c578519274d14a78b89f87c-f8238a99880aac6151736010e575fab1/0b/symbols_0bf4cffb45cb261625f2f3fca21a4789.map
 
    Failure message: ENOMEM: not enough memory, write
 
      at writeFileSync (node_modules/write-file-atomic/index.js:215:10)
      at writeCacheFile (node_modules/@jest/transform/build/ScriptTransformer.js:809:33)
      at ScriptTransformer.transformSource (node_modules/@jest/transform/build/ScriptTransformer.js:554:7)
      at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:586:40)
      at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:624:25)

如何修复我的 jest 配置以防止这种情况发生?

【问题讨论】:

  • 你能解决吗?如果没有,你能上传你的 package.json 吗?

标签: node.js reactjs memory jestjs


【解决方案1】:

首先,通过使用以下选项运行 jest 来确保您有泄漏测试: jest --logHeapUsage

运行您的测试并检查内存消耗是否随着时间的推移而增加,如下所示(文件名已更改):

PASS  __tests__/pages/file.test.tsx (181 MB heap size)
 PASS  __tests__/pages/file2.test.tsx (193 MB heap size)
 PASS  __tests__/components/Header/file3.test.tsx (201 MB heap size)
 PASS  __tests__/components/Header/file4.test.tsx (192 MB heap size)
 PASS  __tests__/components/Header/file5.test.tsx (218 MB heap size)
 PASS  __tests__/pages/file6.test.tsx (201 MB heap size)
 PASS  __tests__/components/file6.test.tsx (203 MB heap size)
 PASS  __tests__/components/file7.test.tsx (213 MB heap size)
 PASS  __tests__/components/file8.test.tsx (234 MB heap size)
 PASS  __tests__/components/file9.test.tsx (222 MB heap size)
 PASS  __tests__/components/file10.test.tsx (240 MB heap size)
 PASS  __tests__/components/file11.test.tsx (231 MB heap size)
 PASS  __tests__/utils/file12.test.tsx (239 MB heap size)
 PASS  __tests__/components/file13.test.tsx (251 MB heap size)
 PASS  __tests__/components/file14.test.tsx (239 MB heap size)
 PASS  __tests__/components/file15.test.tsx (249 MB heap size)
 PASS  __tests__/components/file16.test.tsx (143 MB heap size)

要解决此问题,请将 package.json 中的 npm run testyarn test 命令更改为: node --expose-gc ./node_modules/.bin/jest --runInBand --logHeapUsage

运行命令。这是我的输出:

 PASS  __tests__/components/file.test.tsx (143 MB heap size)
 PASS  __tests__/pages/onboarding/file1.test.tsx (149 MB heap size)
 PASS  __tests__/components/file2.test.tsx (146 MB heap size)
 PASS  __tests__/components/file3.test.tsx (146 MB heap size)
 PASS  __tests__/components/file4.test.tsx (153 MB heap size)
 PASS  __tests__/components/Header /file5.test.tsx (149 MB heap size)
 PASS  __tests__/pages/file6.test.tsx (149 MB heap size)
 PASS  __tests__/pages/file7.test.tsx (149 MB heap size)
 PASS  __tests__/components/file8.test.tsx (147 MB heap size)
 PASS  __tests__/components/file9.test.tsx (148 MB heap size)
 PASS  __tests__/pages/file10.test.tsx (148 MB heap size)
 PASS  __tests__/components/Header /file11.test.tsx (148 MB heap size)
 PASS  __tests__/functions/file12.test.tsx (149 MB heap size)
 PASS  __tests__/components/file13.test.tsx (148 MB heap size)
 PASS  __tests__/components/file14.test.tsx (150 MB heap size)
 PASS  __tests__/components/file15.test.tsx (150 MB heap size)
 PASS  __tests__/components/Header /file16.test.tsx (149 MB heap size)
 PASS  __tests__/components/file17.test.tsx (149 MB heap size)
 PASS  __tests__/utils/file18.test.tsx (150 MB heap size)
 PASS  __tests__/components/file19.test.tsx (149 MB heap size)
 PASS  __tests__/pages/file20.test.tsx (150 MB heap size)

如您所见,内存消耗更加一致。

您可以在 this Github issue 中阅读有关此问题和解决方案的更多信息,其中描述了 jest 的泄漏垃圾收集器问题。

【讨论】:

    【解决方案2】:

    您可以使用jest -w 1 来避免这些内存问题。

    更多关于Jest CLI documentation的信息

    --maxWorkers=|# 别名:-w。指定工作池为运行测试生成的最大工作人员数。在单次运行中 模式,这默认为您的可用内核数 机器减一作为主线程。在手表模式下,默认为 你机器上一半的可用内核,以确保 Jest 是 不显眼,不会让您的机器停机。它可能是 在 CI 等资源有限的环境中调整这一点很有用,但 对于大多数用例,默认值应该足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多