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

时间:2014-08-05 15:04:42

标签: node-inspector jestjs

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

我尝试了几种方法

node-debug jest --runInBand 

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

$ node-inspector
$ node --debug-brk .\node_modules\jest-cli --runInBand

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

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

以前有人试过吗?

4 个答案:

答案 0 :(得分:15)

问题似乎是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);
});

我能够通过注释掉jest用来产生协调过程的代码来成功调试jest测试(尽管tests that use JSX transforms are incredibly slow)。

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

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

然后你可以运行:

$ node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand

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"
    }
...

当然,此解决方案的主要问题是编辑jest源代码。将考虑如何提出拉动请求来制作此棒。

在此处创建Github问题https://github.com/facebook/jest/issues/152

答案 1 :(得分:13)

现在官方支持,节点&gt; = 6.3。
引用Jest documentation

  

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

node --debug-brk --inspect ./node_modules/.bin/jest -i [any other arguments here]
     

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

     

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

     

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

答案 2 :(得分:4)

这是一个Gruntfile.js配置,用于自动化@ Sean对Grunt的回答。

grunt testd

OR

grunt testd --tests=MyTestName

OR

grunt testd --tests=MyTestName,AnotherTestName

需要“node-inspector”(必须全局安装以获取路径中的节点调试bin),“lodash”,“jest-cli”和“grunt-shell”节点模块。

var _ = require('lodash');

var commaSplitToRegex = function(input) {
  return _.map(input.split(','), function(part) {
    return '(' + part + ')';
  }).join('|');
};

var getTestRegex = function(tests) {
  if (tests) {
    return '.*' + commaSplitToRegex(tests) + '.*';
  }

  return '.*';
}

module.exports = function(grunt) {
  grunt.loadNpmTasks('grunt-shell');

  grunt.initConfig({
    shell: {
      jestd: {
        command: function() {
          var testsRegex = getTestRegex(grunt.option('tests'));
          var cmd = 'node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand --config="test_utils/jest.json"';

          if (testsRegex) {
            cmd += ' "' + testsRegex + '"';
          }

          return cmd;
        }
      },
      monkeypatchjest: {
        command: 'sed -i.bak s\\/harmonize\\(\\)\\;\\/\\\\/\\\\/wtf\\/g ./node_modules/jest-cli/bin/jest.js'
      },
      unmonkeypatchjest: {
        command: 'sed -i.bak s\\/\\\\/\\\\/wtf\\/harmonize\\(\\)\\;\\/g ./node_modules/jest-cli/bin/jest.js'
      }
    }
  });

  grunt.registerTask('testd', 'Run tests with debugger.', ['shell:monkeypatchjest', 'shell:jestd']);
};

答案 3 :(得分:4)

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

$ npm install -D jest-environment-node-debug
$ node --inspect-brk ./node_modules/.bin/jest -i --env jest-environment-node-debug