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
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.
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ê:
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.