【问题标题】:Out of memory exception while running mocha test case in nodejs在 nodejs 中运行 mocha 测试用例时出现内存不足异常
【发布时间】:2017-02-01 11:45:37
【问题描述】:

对于单元测试,我正在使用mocha,最近我在运行测试用例时观察out of memory exception

--- Last few GCs --->

  548213 ms: Scavenge 1365.3 (1457.7) -> 1365.3 (1457.7) MB, 1.2 / 0 ms (+ 1.5 ms in 2 steps since last GC) [allocation failure] [incremental marking delaying mark-sweep].
  549442 ms: Mark-sweep 1365.3 (1457.7) -> 1364.3 (1457.7) MB, 1228.6 / 0 ms (+ 2.8 ms in 4 steps since start of marking, biggest step 1.2 ms) [last resort gc].
  550603 ms: Mark-sweep 1364.3 (1457.7) -> 1309.1 (1457.7) MB, 1161.4 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x30d0b01e3ac1 <JS Object>
    2: _compile [module.js:~380] [pc=0x333b9a368f36] (this=0x29e81578a591 <a Module with map 0x364941617b89>,content=0x4ec389e5fd1 <Very long string[26212]>,filename=0x31a758c32891 <String[92]: /Users/pulkit.sharva/apps/code/node_modules/bluebird/js/release/debuggability.js>)
    3: .js [module.js:~420] [pc=0x333b9869e18b] (this=0x1b3ffe7cfcc9 <an Object with map 0x364941655fb9>,mod...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
sh: line 1: 38263 Abort trap: 6           NODE_ENV=test istanbul cover _mocha -- --timeout 3000 -R spec --recursive test

无论如何/工具我可以通过它来确定是哪个测试用例导致了这种情况,因为我可以看到我的堆大小正在迅速增加

code pulkit.sharva$ node --expose-gc
        > process.memoryUsage();
        { rss: 21069824, heapTotal: 9587488, heapUsed: 4520544 }
        > process.memoryUsage();
        { rss: 22892544, heapTotal: 9587488, heapUsed: 5407376 }
        > process.memoryUsage();
        { rss: 23261184, heapTotal: 10619424, heapUsed: 5785296 }
        > process.memoryUsage();
        { rss: 23560192, heapTotal: 10619424, heapUsed: 6075440 }
        > process.memoryUsage();
        { rss: 23642112, heapTotal: 10619424, heapUsed: 6158888 }
        > process.memoryUsage();
        { rss: 23715840, heapTotal: 10619424, heapUsed: 6231968 }

【问题讨论】:

  • 你的测试用例中是否有很多断言,你可以尝试用.only()一一启动?
  • 如果我使用 .only 运行测试用例或单独运行测试用例文件,它都会完美运行
  • 我找到了解决方案,我已经将我的所有测试套件分成多个部分,一个用于控制器,一个用于服务等,分别运行它们并使用 istanbul-combine 来整理单个运行的结果。
  • @Pulkit 你能详细解释一下吗?
  • 当你运行 istanbul-coverage 时,它​​一次将所有文件加载到内存中,因为我分解为多个 istanbul-coverage 内存消耗很低,后来我使用了 istanbul-combine 来整理结果。如果你愿意,我可以将方法添加为 asnwer

标签: node.js unit-testing out-of-memory mocha.js


【解决方案1】:

好的,所以我没有很好的答案来解释为什么会这样,但似乎测试本身是否存在实际错误(缺少要求、未定义的函数等)mocha 并不总是很好玩这样,它不会抛出错误并终止测试,而是决定紧紧抓住它,直到发生堆溢出并且整个节点崩溃。

我正在使用我们自己的代码库,我们的测试设置中有一个部分类似于:

// TODO: why do we need these?
process.on("unhandledRejection", err => {
  throw err;
});
process.on("uncaughtException", err => {
  throw err;
});

因为我正在重构并且没有明显的答案,所以我删除了这些行,编写了一个新测试(不小心出现了问题)并得到了您描述的溢出错误。我重新添加了这些行,然后 mocha 实际上完成了让我知道测试中的实际问题。

老实说,我不是 100% 确定为什么这段代码似乎会阻止这种情况,并且希望其他评论者或答案更深入,但对于遇到此问题的其他人来说,这可能会帮助你摆脱困境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多