Depuración de casos de prueba de Jest usando node-inspector


¿Hay alguna forma de usar node-inspector para depurar pruebas unitarias con Jest? Sería bueno pasar a través de veces para ver por qué las pruebas están fallando

He intentado algunas maneras

node-debug jest --runInBand 

Desde el así como la puesta en marcha del inspector primero eg

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

Y luego vaya a http://127.0.0.1:8080/debug?port=5858

He encontrado que ocasionalmente (1 de cada 10 o más veces), el depurador abre los archivos src de jest y es posible depurarlos. Generalmente, sin embargo, los scripts en el depurador solo contienen una carpeta 'sin dominio' y otra carpeta irrelevante. Además, los scripts de prueba nunca se cargan en el depurador.

Alguien Ha intentado esto antes?

Author: Ron, 2014-08-05

4 answers

Parece que el problema es que jest está usando harmonize, lo que genera un proceso hijo para garantizar que se use la opción --harmony.

Harmonize/harmonize.js, líneas 30 a 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);
});

Pude depurar con éxito las pruebas de jest (aunque las pruebas que usan transformaciones JSX son increíblemente lentas) comentando el código que jest está usando para generar el proceso armonizado.

Node_modules/jest-cli/bin/jest.js, últimas líneas del archivo:

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

, Entonces usted puede ejecutar:

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

Jest se basa en que la bandera --harmony esté allí, por eso necesitamos agregarla de nuevo con --nodejs --harmony. También agregamos --runInBand para que las pruebas se ejecuten en secuencia, no en paralelo.

Esto abre el depurador web, y puede depurar las pruebas, aunque puede ser bastante lento llegar a la prueba que desea. Por favor, comente si alguien conoce una manera de hacer esto más rápido, y actualizaré mi respuesta.

Puede agregar esto a su package.json para que sea más fácil de patear off:

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

Por supuesto, la principal preocupación con esta solución es la edición del código fuente jest. Pensará en cómo hacer una solicitud de extracción para hacer que este palo.

Creado Problema Github Aquí: https://github.com/facebook/jest/issues/152

 14
Author: Sean Adkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-16 23:58:51

Ahora está soportado oficialmente con Node >= 6.3.
Citando Documentación de broma :

Coloque una instrucción debugger; en cualquiera de sus pruebas, y luego, en el directorio de su proyecto, ejecute:

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

Esto generará un enlace que puede abrir en Chrome. Después de abrir ese enlace, se mostrarán las Herramientas para desarrolladores de Chrome, y se establecerá un punto de interrupción en la primera línea del script CLI de Jest (esto se hace simplemente para darle tiempo para abrir el desarrollador herramientas y para evitar que Jest se ejecute antes de que tenga tiempo para hacerlo). Haga clic en el botón que parece un botón "reproducir" en la parte superior derecha de la pantalla para continuar la ejecución. Cuando Jest ejecuta la prueba que contiene la instrucción debugger, la ejecución se detendrá y puede examinar el ámbito actual y la pila de llamadas.

Nota: la opción cli -i se asegura de que Jest ejecute test en el mismo proceso en lugar de generar procesos para pruebas individuales. Normalmente Bromeo paraleliza las ejecuciones de prueba a través de los procesos, pero es difícil depurar muchos procesos al mismo tiempo.

Puede encontrar más información sobre el inspector V8 aquí: https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js

 12
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-22 14:32:01

Aquí hay un archivo Gruntfile.configuración de js para automatizar la respuesta de @Sean con Grunt.

grunt testd

O

grunt testd --tests=MyTestName

O

grunt testd --tests=MyTestName,AnotherTestName

Requiere los módulos de nodo "node-inspector" (debe estar instalado globalmente para obtener el bin node-debug en su ruta), "lodash", "jest-cli" y "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
Author: limscoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-06 00:11:28

Usando el nodo 7.4.0, Jest 18.x, y el paquete jest-environment-node-debug (de este comentario ), ahora es posible usar chrome devtools para depurar las pruebas de Jest:

$ npm install -D jest-environment-node-debug
$ node --inspect-brk ./node_modules/.bin/jest -i --env jest-environment-node-debug
 4
Author: ptaylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 17:59:50