在Jest中调试内存泄漏应遵循哪些步骤?

时间:2018-12-19 14:17:02

标签: memory-leaks jestjs

我在Jest中进行的测试似乎正在泄漏:

enter image description here enter image description here

建议调试这些问题的步骤是什么?

我是这种问题的新手。如您所见,我尝试传递the options documented in Jest(--forceExit --detectOpenHandles --runInBand --logHeapUsage),但这不能解决我的问题。

1 个答案:

答案 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/的列表中,然后您可以进行内存分析并进行堆转储测试过程。