Cucumber-js: Formateador JSON: registra la excepción de seguimiento de pila y debe registrar errores de aserciones de pepino

Creado en 19 oct. 2017  ·  12Comentarios  ·  Fuente: cucumber/cucumber-js

Hola,

Creo que hay un error en 'json_formatter.js' en la línea 213, vea el fragmento a continuación:

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

Cualquier prueba fallida dará como resultado que el seguimiento de la pila se registre cuando, en mi opinión, debería ser el mensaje de excepción como mínimo y, potencialmente, el seguimiento de la pila también (sería bueno si pudiera activar / desactivar los errores de seguimiento de la pila).

¿Alguien puede confirmar si se trata de un error y cómo se resolverá?

Estoy ejecutando NightwatchJS con CucumberJS, los detalles de mi entorno son los siguientes:

Nodo: v8.7.0
Pepino - v3.03
Vigilancia nocturna - v0.9.16
Pepino Nightwatch - v8.2.2
Navegador: Chrome v61.0.3163.100
Controlador de Chrome - v2.32
Selenio - v3.5.3
SO - Windows 7

He adjuntado una copia de la salida del formateador json que muestra el mensaje de error en la línea 86

Saludos,
Neville Humphrey

chrome.cucumber.json.zip

Comentario más útil

Hola finaruioana,

En su versión local de cucumber / lib / formatter / json_formatter.js, ¿podría probar si cambiar la línea 213 a lo siguiente funciona para usted?

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

Si lo hace, puedo poner una solicitud de extracción con la solución anterior, ya que no parece haber ningún impulso en este problema.

Todos 12 comentarios

¿Nadie más ha visto este error?

Sostengo que esto es un error. La línea de código en json_formatter @ 213 debe ser:

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

y no

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

De esa forma, obtiene el error de aserción y el seguimiento de la pila.

He visto el mismo problema, por favor, ¿alguien puede confirmar que se trata de un error?

Según mi experiencia en chrome y node, Error: <message> es la primera línea de la pila. Error: <message> es el resultado de error.toString() . Podríamos usar algo como:

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

Puede confirmar que la pila no incluye el mensaje en safari. Veo el mensaje en la pila en Chrome 61 y nodo 8.

Encuentro el mismo problema al usar pepino de vigilancia nocturna (la falla a menudo dará como resultado un mensaje de error sin una pila). Es un error para mi

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

Si el mensaje de excepción se incluye en la pila, esta solución puede proporcionar un mensaje de error sin repetición. De lo contrario, el mensaje de excepción se coloca antes.

Hola,

Tenemos un problema similar en la misma línea, pero debido al tipo de este elemento.
En el archivo de informe json generado, error_message es una cadena O un objeto. ¿Podríamos tener coherencia aquí? Esperando escuchar los pensamientos de la gente al respecto.

El problema para nosotros es cuando intentamos generar el informe html desde json. Por el momento, la biblioteca cucumber-html-reporter espera que este mensaje de error sea una cadena. Cuando lo obtenemos como objeto, el reportero html falla.

Yendo más allá, obtenemos esta diferencia de tipo debido a las pruebas que utilizan diferentes bibliotecas de navegador. Siempre que ejecutamos las pruebas usando webdriverio, pasa la generación del informe. Pero al usar webdriverjs-angular, report.json tendrá el error_message como un objeto y, por lo tanto, el error al generar el informe html.

Según su respuesta, es posible que deba plantear el problema en un lugar diferente, pero pensé que el mejor lugar para comenzar con esto es ver si podemos tener coherencia sobre el tipo de mensaje de error.

¡Gracias!

Hola finaruioana,

En su versión local de cucumber / lib / formatter / json_formatter.js, ¿podría probar si cambiar la línea 213 a lo siguiente funciona para usted?

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

Si lo hace, puedo poner una solicitud de extracción con la solución anterior, ya que no parece haber ningún impulso en este problema.

Hola @humphreyn

De hecho, hacer los cambios anteriores resolvió mi problema. También agregaría un if en la pila antes de agregarlo, en mi caso, agregaba 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;

¡Gracias!

Di por sentado que la excepción es un objeto con el mensaje y la pila definidos, pero si ese no es siempre el caso, se necesitan pequeños ajustes:

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

Este código evita que se agregue "indefinido" al mensaje_error si el mensaje o la pila no están definidos. Si ambos son una cadena vacía o indefinida, el objeto de excepción se asigna a error_message. Si queremos hacer cumplir una cadena error_message podemos usar 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 cree que esta solución estaría bien (para probar en un entorno local debe usar _lodash lugar de _ )

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

sí, se ve bien @innocentiv. Lo probé y parece funcionar bien.

@innocentiv , también puedo confirmar que esos cambios funcionan localmente para mí en Chrome, es decir, y en Firefox con la siguiente configuración:
nodejs: v8.9.0
cucumberjs: v 3.1.0
Nightwatch-pepino: v0.9.16
selenio independiente: v3.4.0
es decir, webdriver: v3.4.0
controlador web Chrome: v2.33
controlador web gecko (firefox): v0.19.1

¿Enviará una solicitud de extracción para aplicar esta corrección?

@humphreyn Solicitud de

Acabo de modificar la solicitud de extracción para verificar la excepción de cadena. Puede probarlo localmente usando:

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

Este hilo se ha bloqueado automáticamente ya que no ha habido ninguna actividad reciente después de que se cerró. Abra un nuevo problema para errores relacionados.

¿Fue útil esta página
0 / 5 - 0 calificaciones