node inspector - test - Depuración de casos de prueba de Jest utilizando nodo-inspector
testing con jest (4)
¿Hay alguna forma de usar el inspector de nodos para depurar las pruebas unitarias con Jest? Sería bueno dar un paso a 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, por ejemplo
$ node-inspector
$ node --debug-brk ./node_modules/jest-cli --runInBand
y luego navega a http://127.0.0.1:8080/debug?port=5858
He encontrado que de vez en cuando (1 de cada 10 veces), el depurador abre los archivos de scripts de broma y es posible depurarlos. Sin embargo, en general, 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?
Aquí hay una configuración de Gruntfile.js para automatizar la respuesta de Sean con Grunt.
grunt testd
O
grunt testd --tests=MyTestName
O
grunt testd --tests=MyTestName,AnotherTestName
Requiere "node-inspector" (debe instalarse globalmente para obtener el bin de depuración de nodo en su ruta), módulos de nodo "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'']);
};
Esto ahora es oficialmente compatible con Node> = 6.3.
Citando la documentación de Jest :
Coloque un
debugger;
declaración 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 puedes abrir en Chrome. Después de abrir ese enlace, se mostrarán las Herramientas del desarrollador de Chrome y se establecerá un punto de interrupción en la primera línea del script Jest CLI (esto se hace simplemente para darle tiempo a abrir las herramientas del desarrollador y evitar que Jest se ejecute antes que usted) tener 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 del
debugger
, la ejecución se detendrá y podrá examinar el alcance actual y la pila de llamadas.Nota: la opción
-i
cli se asegura de que Jest ejecute la prueba en el mismo proceso en lugar de los procesos de generación de pruebas individuales. Normalmente, Jest paraliza la ejecución de pruebas en todos 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
Parece que el problema es que la jest
está usando harmonize
, que genera un proceso secundario para garantizar que se use la opción --harmony
.
harmonize / harmonize.js, líneas 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);
});
Pude depurar con éxito las pruebas de broma (aunque las pruebas que usan transformadas JSX son increíblemente lentas ) al comentar el código que se usa 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 puedes ejecutar:
$ node-debug --nodejs --harmony ./node_modules/jest-cli/bin/jest.js --runInBand
Jest confía en que la bandera --harmony
esté allí, por eso tenemos que volver a agregarla --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 realizar la prueba que desee. Comente si alguien sabe cómo hacerlo más rápido y actualizaré mi respuesta.
Puede agregar esto a su package.json
para facilitar el inicio:
...
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 de jest
. Pensará en cómo hacer una solicitud de extracción para hacer este palo.
Se creó el problema de Github aquí : https://github.com/facebook/jest/issues/152
Utilizando el Nodo 7.4.0, Jest 18.x, y el paquete jest-environment-node-debug
(de este comentario ), ahora es posible usar los devtools de Chrome 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