Cucumber-js: process.exit()๋ฅผ process.exitCode๋กœ ๊ต์ฒด

์— ๋งŒ๋“  2017๋…„ 08์›” 03์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: cucumber/cucumber-js

์•„๋ž˜์— ๋งํฌ๋œ Node.js ๊ถŒ์žฅ ์‚ฌํ•ญ์— ๋”ฐ๋ผ process.exit() ํ˜ธ์ถœ( run.js ์˜ ๋ช‡ ์žˆ์Šต๋‹ˆ๊นŒ ? ์ œ ๊ฒฝ์šฐ์—๋Š” ๋น„๋™๊ธฐ ํŒŒ์ผ ๋กœ๊ฑฐ๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ๋ณด๋ฅ˜ ์ž‘์—… ์ค‘์—์„œ ํ”Œ๋Ÿฌ์‹œํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ๊ธฐ ์ „์— Cucumber.js๊ฐ€ ๋…ธ๋“œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

https://nodejs.org/api/process.html#process_process_exit_code

process.stdout ๋ฐ process.stderr์— ๋Œ€ํ•œ I/O ์ž‘์—…์„ ํฌํ•จํ•˜์—ฌ ์•„์ง ์™„์ „ํžˆ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ณด๋ฅ˜ ์ค‘์ธ ๊ฒฝ์šฐ์—๋„ process.exit()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. . ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ process.exit()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„์— ๋ณด๋ฅ˜ ์ค‘์ธ ์ถ”๊ฐ€ ์ž‘์—…์ด ์—†์œผ๋ฉด Node.js ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. process.exitCode ์†์„ฑ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ๋•Œ ์‚ฌ์šฉํ•  ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์„ธ์Šค์— ์•Œ๋ฆฌ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

help wanted good first issue

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

๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์ €ํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” ์ฃผ๋กœ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๋…ธ๋“œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋ฒ„์ „ 6 ๋ฐ 8์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 2018๋…„ 4์›”(๋…ธ๋“œ๊ฐ€ ์ง€์› ์ค‘๋‹จ๋  ๋•Œ)๊นŒ์ง€ ์ง€์›๋˜๋Š” ๋ฒ„์ „ 4์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด CLI ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. process.exit ๋Œ€์‹  process.exitCode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” --drain-event-loop ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

ํ›„ํฌ/๋‹จ๊ณ„ ์ •์˜์—์„œ ๋กœ๊ฑฐ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค์ด-js๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ AfterFeatures ์˜ ์ž„์˜์˜ setTimeout ์ด์ง€๋งŒ exitCode ์— ๋Œ€ํ•ด ๋” ์ผ์ฐ ๋ฐฐ์šฐ๊ณ  ๋‹ค๊ฐ€์˜ค๋Š” registerHandler ๊ฐ๊ฐ€์ƒ๊ฐ์œผ๋กœ ์ธํ•ด ํ•ดํ‚น์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•œ ํ›„ I ๋กœ์ปฌ run.js๋ฅผ ํŽธ์ง‘ํ–ˆ์œผ๋ฉฐ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 1) ๋…ธ๋“œ ๊ณต์‹ ๊ถŒ์žฅ ์‚ฌํ•ญ, 2) ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋  ๋•Œ ๋”๋ฏธ setTimeout์ด ๋„์ž…ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ณ„ ์ง€์—ฐ, 3) ๋‹ค๋ฅธ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด Cucumber๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜์›ํžˆ ๋งค๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ฐœ๋ณ„ ๋‹จ๊ณ„์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฌดํ•œํ•œ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์„๊นŒ์š”? ์ฆ‰์‹œ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  Node์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ข…๋ฃŒ๋ฅผ ์š”์ฒญํ•˜๋Š” ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

registerHandler('AfterFeatures', function (features, callback) {
  setTimeout(callback, 1000);
});

๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์ €ํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” ์ฃผ๋กœ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๋…ธ๋“œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋ฒ„์ „ 6 ๋ฐ 8์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 2018๋…„ 4์›”(๋…ธ๋“œ๊ฐ€ ์ง€์› ์ค‘๋‹จ๋  ๋•Œ)๊นŒ์ง€ ์ง€์›๋˜๋Š” ๋ฒ„์ „ 4์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด CLI ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. process.exit ๋Œ€์‹  process.exitCode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” --drain-event-loop ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” Cucumber.js๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ๋ง๋ถ™์ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” --format json ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ์ด stdout ์ŠคํŠธ๋ฆผ์˜ 8K ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด Cucumber์˜ process.exit ๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์กฐ๊ธฐ์— ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์ฒซ ๋ฒˆ์งธ ์ฒญํฌ๋งŒ ๋‹ค์‹œ ๊ฐ€์ ธ์™€ ์ž˜๋ฆฝ๋‹ˆ๋‹ค. ์ถœ๋ ฅ. process.exit ์ œ๊ฑฐํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๊ณง ์ œ์ถœํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@charlierudolph ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜์— ๋”ฐ๋ผ ๋ถˆ์™„์ „ํ•˜์ง€๋งŒ pull ์š”์ฒญ์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. CLI ํ”Œ๋ž˜๊ทธ ๋ถ€๋ถ„์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ‘œ์ค€ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ฒดํฌ ํ•œ ํ›„ ์ถœ๋ ฅ์„ ์ ˆ๋‹จ ํ•œ ํฌ๋งท json์œผ๋กœ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ Cucumber.js๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋•Œ๋ฌธ์ด์—ˆ๋‹ค ๋‚ด๊ฐ€๋กœ ์‹คํ–‰์ค‘์ธ ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด process.exit ํ•˜๋“œ ์ข…๋ฃŒ์ž…๋‹ˆ๋‹ค ๊ทธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋‚˜๋จธ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ | cat ๋ฅผ ๋‚ด ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ช…๋ น์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ ์ „์ฒด ์ถœ๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์œ„์˜ PR์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ฒ„์ „ 4๊ฐ€ ์ผ๋ชฐ๋˜๋Š” ๋ช‡ ๋‹ฌ ์•ˆ์— ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” ๋‹ซํžŒ ํ›„ ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰