web-dev-qa-db-fra.com

Débogage des cas de test Jest à l'aide de node-inspector

Existe-t-il un moyen d'utiliser node-inspector pour déboguer les tests unitaires avec Jest? Ce serait bien de passer parfois pour voir pourquoi les tests échouent

J'ai essayé plusieurs façons

node-debug jest --runInBand 

à partir du ainsi que le démarrage de l'inspecteur d'abord par exemple

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

puis accédez à http://127.0.0.1:8080/debug?port=5858

J'ai constaté que de temps en temps (environ 1 fois sur 10), le débogueur ouvre les fichiers src jest et il est possible de les déboguer. Cependant, en règle générale, les scripts du débogueur ne contiennent qu'un dossier "sans domaine" et un autre dossier non pertinent. De plus, les scripts de test eux-mêmes ne sont jamais chargés dans le débogueur.

Quelqu'un a-t-il déjà essayé cela?

37
Ron

Il semble que le problème est que jest utilise harmonize, qui génère un processus enfant pour garantir que l'option --harmony Est utilisée.

harmonize/harmonize.js, lignes 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);
});

J'ai réussi à déboguer les tests de plaisanterie (bien que les tests qui utilisent des transformations JSX sont incroyablement lents ) en commentant le code que jest utilise pour lancer le processus harmonisé.

node_modules/jest-cli/bin/jest.js, dernières lignes du fichier:

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

Ensuite, vous pouvez exécuter:

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

Jest repose sur le drapeau --harmony, C'est pourquoi nous devons l'ajouter à nouveau avec --nodejs --harmony. Nous ajoutons également --runInBand Pour que les tests s'exécutent en séquence et non en parallèle.

Cela ouvre le débogueur Web et vous pouvez déboguer les tests, bien qu'il puisse être assez lent pour arriver au test que vous souhaitez. Veuillez commenter si quelqu'un connaît un moyen d'accélérer le processus, et je mettrai à jour ma réponse.

Vous pouvez l'ajouter à votre package.json Pour faciliter le démarrage:

...
    scripts: {
        "test": "jest",
        "test-debug": "node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand"
    }
...

Bien sûr, la principale préoccupation de cette solution est l'édition du code source jest. Pensera à la façon de faire une demande de tirage pour faire ce bâton.

Problème Github créé ici : https://github.com/facebook/jest/issues/152

16
Sean Adkinson

Ceci est désormais officiellement pris en charge avec Node> = 6.3.
Citation documentation Jest :

Placez une instruction debugger; Dans l'un de vos tests, puis, dans le répertoire de votre projet, exécutez:

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

Cela produira un lien que vous pouvez ouvrir dans Chrome. Après avoir ouvert ce lien, les outils de développement Chrome Chrome seront affichés, et un point d'arrêt sera défini à la première ligne du script CLI Jest (cela se fait simplement pour vous donner le temps d'ouvrir le développeur et d'empêcher Jest de s'exécuter avant que vous n'ayez le temps de le faire). Cliquez sur le bouton qui ressemble à un bouton "lecture" dans le coin supérieur droit de l'écran pour continuer l'exécution. Lorsque Jest exécute le test qui contient le debugger, l'exécution se mettra en pause et vous pourrez examiner la portée actuelle et la pile d'appels.

Remarque: l'option -i Cli garantit que Jest exécute le test dans le même processus plutôt que de générer des processus pour des tests individuels. Normalement, Jest parallélise les exécutions de test entre les processus, mais il est difficile de déboguer de nombreux processus en même temps.

Plus d'informations sur l'inspecteur V8 peuvent être trouvées ici: https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js

14
Dan Abramov

Utilisation de Node 7.4.0, Jest 18.x et jest-environment-node-debug package (à partir de ce commentaire ), il est désormais possible d'utiliser les chrome devtools pour déboguer les tests Jest:

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

Voici une configuration Gruntfile.js pour automatiser la réponse de @ Sean avec Grunt.

grunt testd

OR

grunt testd --tests=MyTestName

OR

grunt testd --tests=MyTestName,AnotherTestName

Nécessite "node-inspector" (doit être installé globalement pour mettre le bin de débogage de noeud sur votre chemin), les modules de noeud "lodash", "jest-cli" et "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