์๋ ํ์ธ์,
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 ํฌ๋งทํฐ ์ถ๋ ฅ ์ฌ๋ณธ์ ์ฒจ๋ถํ์ต๋๋ค.
๋ฌธ์ ์ธ์ฌ,
๋ค๋น ํํ๋ฆฌ
์๋ฌด๋ ์ด ๋ฒ๊ทธ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๊น?
๋๋ ์ด๊ฒ์ด ๋ฒ๊ทธ๋ผ๊ณ ์ฃผ์ฅํ๋ค. 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);
}
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฒ๊ทธ์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ finaruioana๋,
์ค์ด/lib/formatter/json_formatter.js์ ๋ก์ปฌ ๋ฒ์ ์์ 213ํ์ ๋ค์์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํจ๊ณผ๊ฐ ์๋์ง ํ ์คํธํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ์ ๋ํ ๊ด์ฌ์ด ์๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ์์ ์์ ์ฌํญ์ผ๋ก ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค.