我在Jest中进行的测试似乎正在泄漏:
建议调试这些问题的步骤是什么?
我是这种问题的新手。如您所见,我尝试传递the options documented in Jest(--forceExit --detectOpenHandles --runInBand --logHeapUsage),但这不能解决我的问题。
答案 0 :(得分:3)
我遇到一个问题,我需要调试一些泄漏内存的测试,发现对运行测试的进程进行堆转储比预期的要难。如果在cli命令中添加--inspect
标志,它将仅检查jest
进程。
为了将调试器附加到测试执行器,请进入node_modules/jest_worker/build/worker.js
并将--inspect
标志添加到工作程序。开玩笑通常会剥去--inspect
标志。
使用此代码:
_initialize() {
const args = process.execArgv.filter(v => !/^--(debug|inspect)/.test(v));
args.push('--inspect');
const child = (_child_process || _load_child_process()).default.fork(
require.resolve('./child'),
// $FlowFixMe: Flow does not work well with Object.assign.
Object.assign(
{
cwd: process.cwd(),
env: Object.assign({}, process.env, {
JEST_WORKER_ID: this._options.workerId,
}),
// Suppress --debug / --inspect flags while preserving others (like --harmony).
execArgv: args,
silent: true,
},
this._options.forkOptions,
),
);
...
}
最后像这样运行测试:
node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage
如果您尚未弹出react-scripts
,则可能必须先执行此操作,然后在完成调试后可以还原更改。 --runInBand
很重要,否则您将获得过多的工作人员,开玩笑地创建的工作人员少于计算机内核的工作人员,因此将很难检查/使用它们。
请勿在{{1}}命令中添加--inspect
标志,因为这样的话,jest进程将使用默认的调试器端口。
完成此步骤后,运行测试并打开node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage
,导航至Google Chrome
,您的进程将出现在chrome://inspect/
的列表中,然后您可以进行内存分析并进行堆转储测试过程。