使用node-inspector调试Jest测试用例

Ron*_*Ron 37 node-inspector jestjs

有没有办法使用节点检查器来使用Jest调试单元测试?有时可以逐步查看测试失败的原因

我尝试了几种方法

node-debug jest --runInBand 
Run Code Online (Sandbox Code Playgroud)

从以及首先启动检查员,例如

$ node-inspector
$ node --debug-brk .\node_modules\jest-cli --runInBand
Run Code Online (Sandbox Code Playgroud)

然后导航到 http://127.0.0.1:8080/debug?port=5858

我偶尔发现(10次左右),调试器打开jest src文件,可以调试它们.但一般来说,调试器中的脚本只包含"无域"文件夹和另一个不相关的文件夹.此外,测试脚本本身永远不会在调试器中加载.

有人曾尝试过这个吗?

Sea*_*son 16

看起来jest正在使用的问题是harmonize,它会生成子进程以确保使用该--harmony选项.

harmonize/harmonize.js,第30-35行

var node = child_process.spawn(process.argv[0], ['--harmony'].concat(process.argv.slice(1)), {});
node.stdout.pipe(process.stdout);
node.stderr.pipe(process.stderr);
node.on("close", function(code) {
    process.exit(code);
});
Run Code Online (Sandbox Code Playgroud)

我能够成功地调试jest测试(尽管使用JSX转换的测试非常慢),通过注释掉jest用来产生协调过程的代码.

node_modules/jest-cli/bin/jest.js,该文件的最后几行:

if (require.main === module) {
  //harmonize();                  <--- comment out
  _main(function (success) {
    process.exit(success ? 0 : 1);
  });
}
Run Code Online (Sandbox Code Playgroud)

然后你可以运行:

$ node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand
Run Code Online (Sandbox Code Playgroud)

Jest依赖于--harmony那里的旗帜,所以我们需要将其添加回来--nodejs --harmony.我们还添加了--runInBand以便测试按顺序运行,而不是并行运行.

这将打开Web调试器,您可以调试测试,尽管进入您想要的测试可能会非常慢.请评论是否有人知道如何加快速度,我会更新我的答案.

您可以将其添加到您package.json的开头,以便更轻松地开始:

...
    scripts: {
        "test": "jest",
        "test-debug": "node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand"
    }
...
Run Code Online (Sandbox Code Playgroud)

当然,这个解决方案的主要问题是编辑jest源代码.将考虑如何提出拉动请求来实现这一点.

在这里创建了Github问题:https://github.com/facebook/jest/issues/152


Dan*_*mov 14

现在,Node> = 6.3正式支持此功能.
引用Jest文档:

debugger;在任何测试中放置一个语句,然后在项目的目录中运行:

node --debug-brk --inspect ./node_modules/.bin/jest -i [any other arguments here]
Run Code Online (Sandbox Code Playgroud)

这将输出您可以在Chrome中打开的链接.打开该链接后,将显示Chrome开发者工具,并在Jest CLI脚本的第一行设置断点(这样做只是为了让您有时间打开开发人员工具并防止Jest在您执行之前执行有时间这样做).单击屏幕右上角看起来像"播放"按钮的按钮以继续执行.当Jest执行包含该debugger语句的测试时,执行将暂停,您可以检查当前范围和调用堆栈.

注意:-icli选项可确保Jest在同一进程中运行测试,而不是为单个测试生成进程.通常,Jest会跨进程并行化测试运行,但很难同时调试多个进程.

有关V8检查器的更多信息,请访问:https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js

  • 这看起来很有希望,我试过了,但它从未停止在调试器声明中.有任何想法吗? (3认同)

pta*_*lor 5

使用 Node 7.4.0、Jest 18.x 和jest-environment-node-debug包(来自此评论),现在可以使用 chrome devtools 来调试 Jest 测试:

$ npm install -D jest-environment-node-debug
$ node --inspect-brk ./node_modules/.bin/jest -i --env jest-environment-node-debug
Run Code Online (Sandbox Code Playgroud)