ノードインスペクターを使用して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ファイルを開き、それらをデバッグできることを発見しました。ただし、通常、デバッガーのスクリプトには「ドメインなし」フォルダーと別の無関係なフォルダーのみが含まれます。また、テストスクリプト自体がデバッガーに読み込まれることはありません。
誰かがこれを以前に試したことはありますか?
問題は、jest
がharmonize
を使用していることで、子プロセスを生成して--harmony
オプションが使用されていることを確認しているようです。
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テストを正常にデバッグすることができました。
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
これは現在正式にサポートされています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
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
以下は、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']);
};