Cucumber-js: Remplacez process.exit() par process.exitCode

Créé le 3 août 2017  ·  6Commentaires  ·  Source: cucumber/cucumber-js

Serait-il possible de remplacer les appels process.exit() (un couple dans run.js est tout ce que j'ai pu trouver) par process.exitCode selon la recommandation Node.js liée ci-dessous. Dans mon cas, Cucumber.js met fin à Node avant que l'enregistreur de fichiers asynchrone n'ait la possibilité de se vider, entre autres opérations en attente possibles dans la boucle d'événements.

https://nodejs.org/api/process.html#process_process_exit_code

Il est important de noter que l'appel de process.exit() forcera le processus à se terminer le plus rapidement possible même s'il y a encore des opérations asynchrones en attente qui ne sont pas encore complètement terminées, y compris les opérations d'E/S vers process.stdout et process.stderr . Dans la plupart des cas, il n'est pas nécessaire d'appeler explicitement process.exit(). Le processus Node.js se fermera de lui-même s'il n'y a pas de travail supplémentaire en attente dans la boucle d'événement. La propriété process.exitCode peut être définie pour indiquer au processus quel code de sortie utiliser lorsque le processus se termine normalement.

help wanted good first issue

Commentaire le plus utile

J'hésite à le faire car je pense que d'autres utilisateurs peuvent rencontrer des problèmes (je pense principalement à ceux qui l'utilisent pour les tests de navigateur, c'est là que je me souviens l'avoir bloqué). De plus, cette recommandation de nœud n'existe que sur les versions 6 et 8. Elle n'existe pas sur la version 4 qui sera prise en charge jusqu'en avril 2018 (lorsque le nœud cessera de prendre en charge). Je serais bien d'ajouter une option CLI pour cela cependant. Quelque chose comme --drain-event-loop qui utilisera process.exitCode au lieu de process.exit.

Tous les 6 commentaires

Pouvez-vous attendre que l'enregistreur ait terminé la définition d'un crochet / d'une étape ? Je me souviens d'un warly, il y avait de nombreux cas où cucumber-js ne sortait pas car il attendait que tout sorte de la boucle d'événement

La solution de contournement actuelle que j'utilise est un setTimeout arbitraire dans AfterFeatures , mais après avoir appris plus tôt à propos de exitCode et revisité le hack en raison de la prochaine dépréciation de registerHandler je J'ai édité run.js local et cela semble très bien fonctionner. Cela vaut vraiment la peine d'être revisité en raison de 1) la recommandation officielle du nœud, 2) le délai par processus introduit par setTimeout factice lors de l'exécution en parallèle et 3) lors de l'exécution de Cucumber par un autre processus de nœud.

J'y ai pensé pour toujours, mais le délai d'attente sur les étapes individuelles ne s'occuperait-il pas de l'infini ? Il doit y avoir un moyen gracieux de demander une sortie avec délai d'attente dans Node sans se terminer immédiatement.

registerHandler('AfterFeatures', function (features, callback) {
  setTimeout(callback, 1000);
});

J'hésite à le faire car je pense que d'autres utilisateurs peuvent rencontrer des problèmes (je pense principalement à ceux qui l'utilisent pour les tests de navigateur, c'est là que je me souviens l'avoir bloqué). De plus, cette recommandation de nœud n'existe que sur les versions 6 et 8. Elle n'existe pas sur la version 4 qui sera prise en charge jusqu'en avril 2018 (lorsque le nœud cessera de prendre en charge). Je serais bien d'ajouter une option CLI pour cela cependant. Quelque chose comme --drain-event-loop qui utilisera process.exitCode au lieu de process.exit.

Je veux juste ajouter que ce problème pose un réel problème pour l'exécution de Cucumber.js en tant que processus enfant. Je fais cela avec --format json , et si ma sortie dépasse la taille de bloc de 8K du flux stdout, je ne récupère que le premier bloc avant que le process.exit Cucumber ne termine prématurément le processus enfant, en tronquant le résultat. J'ai supprimé le process.exit et le problème a été résolu.

Je vais essayer de soumettre une demande de tirage pour cela bientôt.

J'ai présenté une pull request, bien qu'elle soit incomplète selon la solution préférée de @charlierudolph ; Je n'ai pas fait la partie indicateur CLI.

J'ai une solution de contournement pour le problème spécifique que je rencontrais, à savoir que l'exécution de Cucumber.js dans un processus enfant avec le formateur JSON tronquait la sortie après le premier morceau de flux stdout, car process.exit est une sortie si difficile ce processus enfant n'attend pas le reste. La solution consistait simplement à ajouter | cat à ma commande de processus enfant, ce qui m'a permis de recevoir la sortie complète dans le processus parent.

Tout le monde serait le bienvenu pour compléter le PR ci-dessus, ou il pourrait être approprié de le fusionner tel quel dans quelques mois lorsque la version 4 prendra fin.

Ce fil a été automatiquement verrouillé car il n'y a eu aucune activité récente après sa fermeture. Veuillez ouvrir un nouveau problème pour les bogues liés.

Cette page vous a été utile?
0 / 5 - 0 notes