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
ํฌ๋กฌ ๋“œ๋ผ์ด๋ฒ„ - v2.32
์…€๋ ˆ๋Š„ - v3.5.3
์šด์˜ ์ฒด์ œ - Windows 7

86ํ–‰์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” json ํฌ๋งทํ„ฐ ์ถœ๋ ฅ ์‚ฌ๋ณธ์„ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์•ˆ ์ธ์‚ฌ,
๋„ค๋นŒ ํ—˜ํ”„๋ฆฌ

chrome.cucumber.json.zip

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” finaruioana๋‹˜,

์˜ค์ด/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;

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด์„ค์…˜ ์˜ค๋ฅ˜์™€ ์Šคํƒ ์ถ”์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์ด ๋ฒ„๊ทธ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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 ๋ฐ ๋…ธ๋“œ 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๋Š” ๋ฌธ์ž์—ด ๋˜๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ผ๊ด€์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์— ๋Œ€ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ƒ๊ฐ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ๋ฌธ์ œ๋Š” json์—์„œ html ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์˜ค์ด-html-๋ฆฌํฌํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด error_message๊ฐ€ ๋ฌธ์ž์—ด์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ค๋ฉด html ๋ฆฌํฌํ„ฐ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋กœ ์ธํ•ด ์ด๋Ÿฌํ•œ ์œ ํ˜• ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. webdriverio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋ณด๊ณ ์„œ ์ƒ์„ฑ์ด ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ webdriverjs-angular๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด report.json์— error_message๊ฐ€ ๊ฐ์ฒด๋กœ ํฌํ•จ๋˜๋ฏ€๋กœ html ๋ณด๊ณ ์„œ ์ƒ์„ฑ ์‹œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์‘๋‹ต์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ์ข‹์€ ์‹œ์ž‘์ ์€ error_message ์œ ํ˜•์— ๋Œ€ํ•ด ์ผ๊ด€์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…•ํ•˜์„ธ์š” finaruioana๋‹˜,

์˜ค์ด/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์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. string 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 , ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋‹ค์Œ ์„ค์ •์œผ๋กœ ํฌ๋กฌ, ์ฆ‰ ํŒŒ์ด์–ดํญ์Šค์—์„œ ๋กœ์ปฌ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
nodejs: v8.9.0
์˜ค์ดjs: v 3.1.0
nightwatch-cucumber: v0.9.16
์…€๋ ˆ๋Š„ ๋…๋ฆฝ ์‹คํ–‰ํ˜•: v3.4.0
์ฆ‰, ์›น๋“œ๋ผ์ด๋ฒ„: v3.4.0
ํฌ๋กฌ ์›น๋“œ๋ผ์ด๋ฒ„: v2.33
๋„๋งˆ๋ฑ€๋ถ™์ด(ํŒŒ์ด์–ดํญ์Šค) ์›น๋“œ๋ผ์ด๋ฒ„: v0.19.1

์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@humphreyn ํ’€ ๋ฆฌํ€˜์ŠคํŠธ: #973

๋ฐฉ๊ธˆ ๋ฌธ์ž์—ด ์˜ˆ์™ธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด pull ์š”์ฒญ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

          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 ๋“ฑ๊ธ‰