对于单元测试我正在使用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 }
答案 0 :(得分:0)
好的,所以我没有很好的答案来解释为什么会这样,但似乎如果测试本身存在实际错误(缺少需求、未定义的函数等),摩卡咖啡并不总是很好玩有了它,而不是抛出错误并终止测试,它决定紧紧抓住它,直到发生堆溢出并且整个节点崩溃。
我正在使用我们自己的代码库,我们的测试设置中有一个部分如下:
// TODO: why do we need these?
process.on("unhandledRejection", err => {
throw err;
});
process.on("uncaughtException", err => {
throw err;
});
因为我在做重构并且没有明显的答案,所以我删除了这些行,写了一个新的测试(不小心出现了问题)并得到了正如你描述的溢出错误。我重新添加了这些行,然后 mocha 实际上完成了让我知道测试中的实际问题。
老实说,我不是 100% 确定为什么这段代码似乎可以防止这种情况发生,并且希望其他评论者或答案更深入,但对于其他遇到此问题的人,这可能会帮助您摆脱困境。