Cucumber-js: Formateur JSON : enregistre l'exception de trace de pile et devrait enregistrer les erreurs d'assertions de concombre

Créé le 19 oct. 2017  ·  12Commentaires  ·  Source: cucumber/cucumber-js

Salut,

Je pense qu'il y a un bogue dans le 'json_formatter.js' à la ligne 213, voir l'extrait ci-dessous :

    if (status === _status2.default.FAILED && exception) {
      data.result.error_message = exception.stack || exception;
    }

Tout test échoué entraînera l'enregistrement de la trace de la pile lorsque l'OMI devrait être au minimum le message d'exception et potentiellement la trace de la pile également (ce serait bien si vous pouviez activer/désactiver les erreurs de trace de la pile).

Quelqu'un peut-il confirmer s'il s'agit d'un bug et comment il sera résolu.

J'exécute NightwatchJS avec CucumberJS, les détails de mon environnement sont les suivants :

Nœud - v8.7.0
Concombre - v3.03
Montre de nuit - v0.9.16
Concombre de veille - v8.2.2
Navigateur - Chrome v61.0.3163.100
Pilote Chrome - v2.32
Sélénium - v3.5.3
Système d'exploitation - Windows 7

J'ai joint une copie de la sortie du formateur json montrant le message d'erreur à la ligne 86

Salutations,
Neville Humphrey

chrome.concombre.json.zip

Commentaire le plus utile

Salut finaruioana,

Dans votre version locale de cucumber/lib/formatter/json_formatter.js, pourriez-vous tester si la modification de la ligne 213 par la suivante fonctionne pour vous :

      let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
      error_message += exception.stack;
      data.result.error_message = error_message || exception;

Si c'est le cas, je peux envoyer une demande de tirage avec le correctif ci-dessus, car il ne semble pas y avoir de traction sur ce problème.

Tous les 12 commentaires

Personne d'autre n'a vu ce bug ?

Je maintiens que c'est un bug. La ligne de code dans le json_formatter @ 213 doit être :

      data.result.error_message = exception.message + exception.stack;

et pas

  data.result.error_message = exception.stack || exception;

De cette façon, vous obtenez l'erreur d'assertion et la trace de la pile.

J'ai vu le même problème, s'il vous plaît, quelqu'un peut-il confirmer qu'il s'agit d'un bug ?

D'après mon expérience dans Chrome et Node, Error: <message> est la première ligne de la pile. Error: <message> est le résultat de error.toString() . Nous pourrions utiliser quelque chose comme :

let msg = exception
if (exception.stack) {
  msg = exception.stack
  if (!_.includes(msg, error.toString()) {
    msg = error.toString() + '\n' + msg
  }
}
data.result.error_message = msg

Peut confirmer que la pile n'inclut pas le message dans safari. Je vois le message dans la pile dans chrome 61 et nœud 8.

Je rencontre le même problème avec le concombre de veille (un échec entraîne souvent un message d'erreur sans pile). C'est un bug pour moi

let error_message = _.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;

Si le message d'exception est inclus dans la pile, cette solution peut fournir un error_message sans répétition. Sinon, le message d'exception est placé avant.

Bonjour,

Nous avons un problème similaire sur la même ligne, mais en raison du type de cet élément.
Dans le fichier de rapport json généré, error_message est une chaîne OU un objet. Pourrions-nous avoir une cohérence ici? En attendant d'avoir l'avis des gens là-dessus.

Le problème pour nous est lorsque nous essayons de générer le rapport html à partir de json. À la minute, la bibliothèque cucumber-html-reporter s'attend à ce que ce error_message soit une chaîne. Lorsque nous l'obtenons en tant qu'objet, le reporter html échoue.

En allant plus loin, nous obtenons cette différence de type en raison de tests utilisant différentes bibliothèques de navigateurs. Chaque fois que nous exécutons les tests à l'aide de webdriverio, la génération du rapport réussit. Mais en utilisant webdriverjs-angular, le report.json aura le error_message en tant qu'objet et donc l'échec lors de la génération du rapport html.

Sur la base de votre réponse, je devrai peut-être soulever le problème à un autre endroit, mais j'ai pensé que le meilleur endroit pour commencer était de voir si nous pouvions avoir une cohérence par rapport au type error_message.

Merci!

Salut finaruioana,

Dans votre version locale de cucumber/lib/formatter/json_formatter.js, pourriez-vous tester si la modification de la ligne 213 par la suivante fonctionne pour vous :

      let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
      error_message += exception.stack;
      data.result.error_message = error_message || exception;

Si c'est le cas, je peux envoyer une demande de tirage avec le correctif ci-dessus, car il ne semble pas y avoir de traction sur ce problème.

Salut @humphreyn

En effet, les modifications ci-dessus ont résolu mon problème. J'ajouterais également un if sur la pile avant de l'ajouter, dans mon cas, j'ajoutais undefined.
javascript let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n'; if (exception.stack) { error_message += exception.stack; } data.result.error_message = error_message || exception;

Merci!

J'ai pris pour acquis que l'exception est un objet avec un message et une pile définis, mais si ce n'est pas toujours le cas, de petits ajustements sont nécessaires :

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;

Ce code empêche l'ajout de "undefined" au error_message si le message ou la pile ne sont pas définis. Si les deux sont une chaîne indéfinie ou vide, l'objet d'exception est affecté à error_message. Si nous voulons appliquer une chaîne error_message, nous pouvons utiliser JSON.stringify :

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || JSON.stringify(exception);

@finaruioana vous pensez que cette solution serait correcte (pour tester dans un environnement local, vous devez utiliser _lodash au lieu de _ )

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _lodash.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;

ouais, ça a l'air bien @innocentiv. Testé et semble fonctionner correctement.

@innocentiv , je peux également confirmer que ces modifications fonctionnent localement pour moi dans chrome, c'est-à-dire et firefox avec la configuration suivante :
nodejs : v8.9.0
concombres : v 3.1.0
veille-concombre : v0.9.16
sélénium autonome : v3.4.0
c'est-à-dire pilote Web : v3.4.0
pilote Web Chrome : v2.33
Pilote Web gecko (firefox) : v0.19.1

Soumettez-vous une pull request pour appliquer ce correctif ?

@humphreyn Pull request: #973

Je viens de modifier la demande d'extraction pour vérifier l'exception de chaîne. Vous pouvez le tester localement en utilisant :

          if (_lodash2.default.isString(exception)) {
            data.result.error_message = exception;
          } else {
            var _exception$message = exception.message,
                message = _exception$message === undefined ? '' : _exception$message,
                _exception$stack = exception.stack,
                stack = _exception$stack === undefined ? '' : _exception$stack;

            message = _lodash2.default.includes(stack, message) ? '' : message + '\n';
            data.result.error_message = message + stack || JSON.stringify(exception);
          }

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

Questions connexes

nicojs picture nicojs  ·  3Commentaires

NoNameProvided picture NoNameProvided  ·  5Commentaires

igniteram picture igniteram  ·  7Commentaires

jfstephe picture jfstephe  ·  4Commentaires

edwinwright picture edwinwright  ·  3Commentaires