Cucumber-js: JSON Formatter: регистрирует исключение трассировки стека и должно регистрировать ошибки утверждений огурца

Созданный на 19 окт. 2017  ·  12Комментарии  ·  Источник: cucumber/cucumber-js

Привет,

Я думаю, что есть ошибка в 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.

С уважением,
Невилл Хамфри

chrome.cucumber.json.zip

Самый полезный комментарий

Привет, 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;

Если это так, я могу отправить запрос на перенос с указанным выше исправлением, поскольку, похоже, в этой проблеме нет никакой поддержки.

Все 12 Комментарий

Больше никто не видел эту ошибку?

Я считаю, что это ошибка. Строка кода в 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);
          }

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги