在nodejs中运行mocha测试用例时出现内存不足异常

时间:2017-02-01 11:45:37

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

对于单元测试我正在使用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 }

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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