Cucumber-js: JSON 格式化程序:记录堆栈跟踪异常并应记录黄瓜断言错误

创建于 2017-10-19  ·  12评论  ·  资料来源: cucumber/cucumber-js

你好,

我认为第 213 行的“json_formatter.js”中有一个错误,请参见下面的代码段:

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

任何失败的测试都将导致在 IMO 时记录堆栈跟踪,它至少应该是 exception.message,并且可能也是堆栈跟踪(如果您可以打开/关闭堆栈跟踪错误,那就太好了)。

有人可以确认这是否是错误以及如何解决。

我用 CucumberJS 运行 NightwatchJS,我的环境细节如下:

节点 - 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 格式化程序输出的副本,显示了第 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

可以确认堆栈不包含 safari 中的消息。 我在 chrome 61 和节点 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是一个字符串OR一个对象。 我们可以在这里保持一致性吗? 等待听听人们对此的看法。

我们的问题是当我们尝试从 json 生成 html 报告时。 目前,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,在我的情况下是附加未定义。
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;

如果未定义消息或堆栈,此代码可防止将“未定义”添加到 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,ie 和 firefox,并具有以下设置:
nodejs: v8.9.0
黄瓜js:v 3.1.0
守夜人黄瓜:v0.9.16
硒独立:v3.4.0
即网络驱动程序:v3.4.0
铬网络驱动程序: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 等级