Cucumber-js: JSON-Formatierer: Protokolliert Stack-Trace-Ausnahmen und sollte Fehler bei Gurkenzusicherungen protokollieren

Erstellt am 19. Okt. 2017  ·  12Kommentare  ·  Quelle: cucumber/cucumber-js

Hi,

Ich denke, es gibt einen Fehler in 'json_formatter.js' in Zeile 213, siehe Snippet unten:

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

Jeder fehlgeschlagene Test führt dazu, dass der Stack-Trace protokolliert wird, wenn es IMO mindestens die Exception.message und möglicherweise auch der Stack-Trace sein sollte (es wäre schön, wenn Sie die Stack-Trace-Fehler ein- und ausschalten könnten).

Kann mir jemand bestätigen, ob dies ein Fehler ist und wie er behoben wird.

Ich betreibe NightwatchJS mit CucumberJS, meine Umgebungsdetails sind wie folgt:

Knoten - v8.7.0
Gurke - v3.03
Nachtwache - v0.9.16
Nachtwache Gurke - v8.2.2
Browser - Chrome v61.0.3163.100
Chrome-Treiber - v2.32
Selen - v3.5.3
Betriebssystem - Windows 7

Ich habe eine Kopie der Ausgabe des Json-Formatierers angehängt, die die Fehlermeldung in Zeile 86 zeigt

Grüße,
Neville Humphrey

chrome.cucumber.json.zip

Hilfreichster Kommentar

Hallo finaruioana,

In Ihrer lokalen Version von cucumber/lib/formatter/json_formatter.js können Sie testen, ob das Ändern von Zeile 213 in Folgendes für Sie funktioniert:

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

Wenn dies der Fall ist, kann ich mit dem obigen Fix eine Pull-Anfrage stellen, da dieses Problem anscheinend nicht weiterverfolgt wird.

Alle 12 Kommentare

Hat sonst noch niemand diesen Fehler gesehen?

Ich behaupte, das ist ein Bug. Die Codezeile im json_formatter @ 213 sollte lauten:

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

und nicht

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

Auf diese Weise erhalten Sie den Assertion-Fehler und den Stack-Trace.

Ich habe das gleiche Problem gesehen, kann mir bitte jemand bestätigen, dass es sich um einen Fehler handelt?

Nach meiner Erfahrung mit Chrome und Node ist Error: <message> die erste Zeile des Stapels. Error: <message> ist das Ergebnis von error.toString() . Wir könnten so etwas verwenden:

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

Kann bestätigen, dass der Stack die Nachricht nicht in Safari enthält. Ich sehe die Nachricht im Stack in Chrome 61 und Node 8.

Ich habe das gleiche Problem mit der Nachtwache-Gurke (ein Fehler führt oft zu einer Fehlermeldung ohne Stack). Es ist ein Bug für mich

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

Wenn die Ausnahmenachricht im Stack enthalten ist, kann diese Lösung eine error_message ohne Wiederholung bereitstellen. Andernfalls wird die Ausnahmenachricht vorangestellt.

Hallo,

Wir haben ein ähnliches Problem in derselben Zeile, jedoch aufgrund des Typs dieses Elements.
In der generierten json-Berichtsdatei ist error_message eine Zeichenfolge ODER ein Objekt. Könnten wir hier eine Konsistenz haben? Warten darauf, die Meinung der Leute dazu zu hören.

Das Problem für uns ist, wenn wir versuchen, den HTML-Bericht aus json zu generieren. Momentan erwartet die Bibliothek cucumber-html-reporter, dass diese error_message ein String ist. Wenn wir es als Objekt erhalten, schlägt der HTML-Reporter fehl.

Weitergehend erhalten wir diesen Typunterschied aufgrund von Tests mit verschiedenen Browserbibliotheken. Immer wenn wir die Tests mit webdriverio ausführen, ist die Berichterstellung erfolgreich. Aber mit webdriverjs-angular hat die report.json die error_message als Objekt und damit den Fehler beim Generieren des HTML-Berichts.

Basierend auf Ihrer Antwort muss ich das Problem möglicherweise an einer anderen Stelle ansprechen, aber ich dachte, der beste Ausgangspunkt wäre, um zu sehen, ob wir eine Konsistenz über den error_message-Typ haben.

Vielen Dank!

Hallo finaruioana,

In Ihrer lokalen Version von cucumber/lib/formatter/json_formatter.js können Sie testen, ob das Ändern von Zeile 213 in Folgendes für Sie funktioniert:

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

Wenn dies der Fall ist, kann ich mit dem obigen Fix eine Pull-Anfrage stellen, da dieses Problem anscheinend nicht weiterverfolgt wird.

Hallo @humphreyn

Tatsächlich haben die oben genannten Änderungen mein Problem gelöst. Ich würde auch ein if auf dem Stack hinzufügen, bevor ich es anfüge, in meinem Fall wurde undefined angehängt.
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;

Vielen Dank!

Ich ging davon aus, dass die Ausnahme ein Objekt mit definierter Nachricht und definiertem Stack ist, aber wenn dies nicht immer der Fall ist, sind kleine Anpassungen erforderlich:

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

Dieser Code verhindert, dass "undefined" zur error_message hinzugefügt wird, wenn Nachricht oder Stack nicht definiert sind. Wenn beide undefiniert oder leer sind, wird das Ausnahmeobjekt error_message zugewiesen. Wenn wir eine Zeichenfolge error_message erzwingen möchten, können wir 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 Sie denken, dass diese Lösung in _lodash anstelle von _ )

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

ja, sieht gut aus @innocentiv. Habe es getestet und scheint gut zu funktionieren.

@innocentiv , ich kann auch bestätigen, dass diese Änderungen für mich lokal in Chrome funktionieren, dh und Firefox mit der folgenden Einrichtung:
nodejs: v8.9.0
Gurkenjs: v 3.1.0
Nachtwache-Gurke: v0.9.16
Selen-Standalone: ​​v3.4.0
zB Webtreiber: v3.4.0
Chrome-Webtreiber: v2.33
Gecko (Firefox) Webtreiber: v0.19.1

Werden Sie eine Pull-Anfrage senden, um diesen Fix anzuwenden?

@humphreyn Pull-Request: #973

Ich habe gerade die Pull-Anfrage geändert, um nach Zeichenfolgenausnahmen zu suchen. Sie können es lokal testen mit:

          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);
          }

Dieser Thread wurde automatisch gesperrt, da nach dem Schließen in letzter Zeit keine Aktivität stattgefunden hat. Bitte öffnen Sie eine neue Ausgabe für verwandte Fehler.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

lamartire picture lamartire  ·  6Kommentare

edwinwright picture edwinwright  ·  3Kommentare

jfstephe picture jfstephe  ·  4Kommentare

ghost picture ghost  ·  7Kommentare

zanona picture zanona  ·  4Kommentare