Привет,
Я думаю, что есть ошибка в json_formatter.js в строке 213, см. Фрагмент ниже:
if (status === _status2.default.FAILED && exception) {
data.result.error_message = exception.stack || exception;
}
Любой неудачный тест приведет к тому, что трассировка стека будет записана, когда IMO это должно быть исключение. Сообщение как минимум и, возможно, трассировка стека (было бы неплохо, если бы вы могли включить / выключить ошибки трассировки стека).
Может ли кто-нибудь подтвердить, является ли это ошибкой и как она будет решена.
Я запускаю NightwatchJS с CucumberJS, детали моей среды следующие:
Узел - v8.7.0
Огурец - v3.03
Ночной дозор - v0.9.16
Ночной дозор огурца - v8.2.2
Браузер - Chrome v61.0.3163.100
Драйвер Chrome - v2.32
Селен - v3.5.3
Ос - Windows 7
Я прикрепил копию вывода json formatter с сообщением об ошибке в строке 86.
С уважением,
Невилл Хамфри
Больше никто не видел эту ошибку?
Я считаю, что это ошибка. Строка кода в json_formatter @ 213 должна быть такой:
data.result.error_message = exception.message + exception.stack;
и не
data.result.error_message = exception.stack || exception;
Таким образом вы получите ошибку утверждения и трассировку стека.
Я видел ту же проблему. Может ли кто-нибудь подтвердить, что это ошибка?
По моему опыту работы с chrome и node Error: <message>
- это первая строка стека. Error: <message>
является результатом error.toString()
. Мы могли бы использовать что-то вроде:
let msg = exception
if (exception.stack) {
msg = exception.stack
if (!_.includes(msg, error.toString()) {
msg = error.toString() + '\n' + msg
}
}
data.result.error_message = msg
Можно подтвердить, что стек не включает сообщение в сафари. Я вижу сообщение в стеке в chrome 61 и node 8.
Я сталкиваюсь с той же проблемой при использовании огурца nightwatch (сбой часто приводит к сообщению об ошибке без стека). Для меня это ошибка
let error_message = _.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;
Если сообщение об исключении включено в стек, это решение может предоставить error_message без повторения. В противном случае сообщение об исключении помещается раньше.
Привет,
У нас есть аналогичная проблема в той же строке, но из-за типа этого элемента.
В сгенерированном файле отчета json error_message является строкой ИЛИ объектом. Можем ли мы иметь здесь последовательность? Жду, чтобы услышать мнение людей об этом.
Проблема для нас заключается в том, что мы пытаемся сгенерировать html-отчет из json. В данный момент библиотека cucumber-html-reporter ожидает, что это error_message будет строкой. Когда мы получаем его как объект, html-репортер терпит неудачу.
Идя дальше, мы получаем эту разницу типов из-за тестов с использованием разных библиотек браузера. Каждый раз, когда мы запускаем тесты с помощью webdriverio, генерация отчета проходит. Но при использовании webdriverjs-angular report.json будет иметь error_message как объект и, следовательно, ошибку при создании отчета html.
Основываясь на вашем ответе, мне может потребоваться поднять проблему в другом месте, но я подумал, что лучше всего начать с этого, чтобы посмотреть, можем ли мы добиться согласованности по типу error_message.
Спасибо!
Привет, Finaruioana,
В вашей локальной версии cucumber / lib / formatter / json_formatter.js не могли бы вы проверить, работает ли для вас изменение строки 213 на следующую:
let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;
Если это так, я могу отправить запрос на перенос с указанным выше исправлением, поскольку, похоже, в этой проблеме нет никакой поддержки.
Привет @humphreyn
Действительно, внесение вышеуказанных изменений решило мою проблему. Я бы также добавил if в стек перед его добавлением, в моем случае добавлялся 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;
Спасибо!
Я считал само собой разумеющимся, что исключение - это объект с определенными сообщением и стеком, но если это не всегда так, требуется небольшая корректировка:
let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;
Этот код предотвращает добавление "undefined" к error_message, если сообщение или стек не определены. Если оба являются неопределенными или пустой строкой, объект исключения присваивается error_message. Если мы хотим применить строку error_message, мы можем использовать 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, вы думаете, что это решение _lodash
вместо _
)
let msg = exception.message || '';
let stack = exception.stack || '';
msg = _lodash.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;
да, хорошо выглядит @innocentiv. Протестировал и вроде работает нормально.
@innocentiv , я также могу подтвердить, что эти изменения работают для меня локально в chrome, т.е. и firefox со следующими настройками:
nodejs: v8.9.0
cucumberjs: версия 3.1.0
Ночной дозор-огурец: v0.9.16
автономный селен: v3.4.0
т.е. веб-драйвер: v3.4.0
Chrome webdriver: v2.33
веб-драйвер gecko (firefox): v0.19.1
Вы отправите запрос на перенос, чтобы применить это исправление?
@humphreyn Запрос на вытягивание: # 973
Я просто изменил запрос на перенос, чтобы проверить исключение строки. Вы можете протестировать его локально, используя:
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);
}
Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.
Самый полезный комментарий
Привет, Finaruioana,
В вашей локальной версии cucumber / lib / formatter / json_formatter.js не могли бы вы проверить, работает ли для вас изменение строки 213 на следующую:
Если это так, я могу отправить запрос на перенос с указанным выше исправлением, поскольку, похоже, в этой проблеме нет никакой поддержки.