首页 > 解决方案 > 在 Jest 中调试内存泄漏的步骤是什么?

问题描述

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

在此处输入图像描述 在此处输入图像描述

调试此类问题的推荐步骤是什么?

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

标签: memory-leaksjestjs

解决方案


我遇到了我需要调试一些泄漏内存的测试,并发现对运行测试的进程进行 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,
    ),
  );
  ...
}

最后像这样运行你的测试: node --expose-gc scripts/test.js --env=jsdom --runInBand --logHeapUsage 如果你没有弹出你的测试react-scripts,你可能必须先这样做,在你完成调试后可以恢复更改。--runInBand很重要,否则你会得到太多的工人,开玩笑创造的工人比你的计算机中的核心少一个,所以很难检查/与他们一起工作。

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

在这一步之后,您运行测试并打开Google Chrome,导航到chrome://inspect/您的进程将出现在列表中Remote Targets,您可以从那里进行内存分析并获取测试进程的堆转储。


推荐阅读