Cucumber-js: Formatador JSON: registra exceção de rastreamento de pilha e deve registrar erros de declarações de pepino

Criado em 19 out. 2017  ·  12Comentários  ·  Fonte: cucumber/cucumber-js

Oi,

Acho que há um bug no 'json_formatter.js' na linha 213, veja o trecho abaixo:

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

Qualquer teste com falha resultará no rastreamento de pilha sendo registrado quando IMO deveria ser a exception.message no mínimo e potencialmente o rastreamento de pilha também (seria bom se você pudesse ligar / desligar os erros de rastreamento de pilha).

Alguém pode confirmar se este é um bug e como será resolvido.

Estou executando NightwatchJS com CucumberJS, meus detalhes de ambiente são os seguintes:

Nó - v8.7.0
Pepino - v3.03
Nightwatch - v0.9.16
Pepino Nightwatch - v8.2.2
Navegador - Chrome v61.0.3163.100
Driver do Chrome - v2.32
Selênio - v3.5.3
OS - Windows 7

Anexei uma cópia da saída do formatador json mostrando a mensagem de erro na linha 86

Cumprimentos,
Neville Humphrey

chrome.cucumber.json.zip

Comentários muito úteis

Oi finaruioana,

Em sua versão local do cucumber / lib / formatter / json_formatter.js, você pode testar se alterar a linha 213 para o seguinte funciona para você:

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

Se isso acontecer, posso colocar uma solicitação de pull com a correção acima, pois não parece haver qualquer tração neste problema.

Todos 12 comentários

Ninguém mais viu esse bug?

Eu afirmo que isso é um bug. A linha de código no json_formatter @ 213 deve ser:

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

e não

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

Dessa forma, você obtém o erro de asserção e o rastreamento de pilha.

Já vi o mesmo problema, alguém pode confirmar que se trata de um bug?

Minha experiência no cromo e no nó é que Error: <message> é a primeira linha da pilha. Error: <message> é o resultado de error.toString() . Podemos 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

Pode confirmar que a pilha não inclui a mensagem no safari. Vejo a mensagem na pilha no Chrome 61 e no nó 8.

Encontro o mesmo problema ao usar o pepino do Nightwatch (a falha geralmente resulta em uma mensagem de erro sem uma pilha). É um bug para mim

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

Se a mensagem de exceção for incluída na pilha, esta solução pode fornecer um error_message sem repetição. Caso contrário, a mensagem de exceção é colocada antes.

Olá,

Temos um problema semelhante na mesma linha, mas devido ao tipo deste elemento.
No arquivo de relatório json gerado, error_message é uma string OU um objeto. Podemos ter uma consistência aqui? Esperando ouvir a opinião das pessoas sobre isso.

O problema para nós é quando tentamos gerar o relatório html do json. No momento, a biblioteca cucumber-html-reporter espera que esta error_message seja uma string. Quando o obtemos como um objeto, o relator html falha.

Indo mais longe, obtemos essa diferença de tipo devido aos testes usando diferentes bibliotecas de navegador. Sempre que executamos os testes usando o webdriverio, a geração do relatório é bem-sucedida. Mas usando webdriverjs-angular, o report.json terá o error_message como um objeto e, portanto, a falha ao gerar o relatório html.

Com base em sua resposta, talvez seja necessário levantar o problema em um lugar diferente, mas achei que o melhor lugar para começar com isso é ver se poderíamos ter uma consistência sobre o tipo error_message.

Obrigado!

Oi finaruioana,

Em sua versão local do cucumber / lib / formatter / json_formatter.js, você pode testar se alterar a linha 213 para o seguinte funciona para você:

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

Se isso acontecer, posso colocar uma solicitação de pull com a correção acima, pois não parece haver qualquer tração neste problema.

Oi @humphreyn

Na verdade, fazer as alterações acima resolveu meu problema. Eu também adicionaria um if na pilha antes de anexá-lo, no meu caso estava anexando indefinido.
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;

Obrigado!

Presumi que a exceção é um objeto com mensagem e pilha definidas, mas se esse não for o caso, pequenos ajustes são necessários:

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 "undefined" seja adicionado a error_message se a mensagem ou pilha não forem definidas. Se ambos forem strings indefinidas ou vazias, o objeto de exceção é atribuído a error_message. Se quisermos impor uma string 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 você acha que esta solução estaria ok (para testar em ambiente local você tem que usar _lodash vez de _ )

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

sim, parece bom @innocentiv. Testei e parece funcionar bem.

@innocentiv , também posso confirmar que essas alterações funcionam localmente para mim no Chrome, ou seja, no Firefox com a seguinte configuração:
nodejs: v8.9.0
cucumberjs: v 3.1.0
pepino-vigia noturno: v0.9.16
selênio autônomo: v3.4.0
ou seja, webdriver: v3.4.0
Chrome webdriver: v2.33
webdriver gecko (firefox): v0.19.1

Você enviará uma solicitação pull para aplicar esta correção?

Solicitação de pull

Acabei de modificar a solicitação pull para verificar se há exceção de string. Você pode testá-lo 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 tópico foi bloqueado automaticamente, pois não houve nenhuma atividade recente depois que ele foi fechado. Abra um novo problema para bugs relacionados.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

edgarechm picture edgarechm  ·  5Comentários

zanona picture zanona  ·  4Comentários

dblooman picture dblooman  ·  7Comentários

NoNameProvided picture NoNameProvided  ·  5Comentários

lamartire picture lamartire  ·  6Comentários