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

Aym*_*byk 6 memory-leaks jestjs

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

在此处输入图片说明 在此处输入图片说明

调试此类问题的建议步骤是什么?

我是这种问题的新手。如您所见,我尝试传递Jest中记录的选项(--forceExit --detectOpenHandles --runInBand --logHeapUsage),但这不能解决我的问题。

Joh*_*gun 6

我遇到了我需要调试一些测试以检查内存泄漏的问题,发现对运行测试的进程进行Heapdump操作比预期的要难。如果您添加--inspect标记cli命令,它将仅检查该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,
    ),
  );
  ...
}
Run Code Online (Sandbox Code Playgroud)

最后,像这样运行测试: node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage 如果您还没有弹出react-scripts,则可能必须先执行该操作,然后在完成调试后可以还原更改。--runInBand非常重要,否则您将获得过多的工作人员,开玩笑会比计算机中拥有的内核减少一个工作人员,因此将很难检查/使用它们。

不要将--inspect标志添加到node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage命令中,因为这样开玩笑的进程将使用默认的调试器端口。

完成此步骤后,您将运行测试并打开Google Chrome,导航到chrome://inspect/您的进程将出现在的列表中,Remote Targets然后您可以进行内存分析并进行测试过程的堆转储。