web-dev-qa-db-ja.com

ノードインスペクターを使用したJestテストケースのデバッグ

ノードインスペクターを使用して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回に1回程度)、デバッガーがjest srcファイルを開き、それらをデバッグできることを発見しました。ただし、通常、デバッガーのスクリプトには「ドメインなし」フォルダーと別の無関係なフォルダーのみが含まれます。また、テストスクリプト自体がデバッガーに読み込まれることはありません。

誰かがこれを以前に試したことはありますか?

37
Ron

問題は、jestharmonizeを使用していることで、子プロセスを生成して--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が使用しているコードをコメント化することにより、JSX変換を使用する テストは信じられないほど遅い ですが)jestテストを正常にデバッグすることができました。

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

16
Sean Adkinson

これは現在正式にサポートされていますwith Node> = 6.3。
引用 Jestドキュメント

debugger;ステートメントを任意のテストで実行し、プロジェクトのディレクトリで次のコマンドを実行します。

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

これにより、Chromeで開くことができるリンクが出力されます。そのリンクを開くと、Chrome Developer Toolsが表示され、ブレークポイントがJest CLIスクリプトの最初の行に設定されます(これは、単に開発者を開く時間を与えるために行われます)ツールを使用して、実行する前にJestが実行されないようにします。画面の右上にある「再生」ボタンのようなボタンをクリックして実行を続行します。Jestがdebuggerステートメントを含むテストを実行するとき、実行が一時停止し、現在のスコープと呼び出しスタックを調べることができます。

注:-i cliオプションは、Jestが個々のテストのプロセスを生成するのではなく、同じプロセスでテストを実行することを確認します。通常、Jestはプロセス間でテストの実行を並列化しますが、同時に多くのプロセスをデバッグすることは困難です。

V8インスペクターの詳細については、こちらをご覧ください。 https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js

14
Dan Abramov

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
5
ptaylor

以下は、Gruntで@Seanの回答を自動化するGruntfile.js設定です。

grunt testd

OR

grunt testd --tests=MyTestName

OR

grunt testd --tests=MyTestName,AnotherTestName

「node-inspector」(ノードデバッグビンをパスに取得するにはグローバルにインストールする必要があります)、「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']);
};
4
limscoder