Skip to main content

๊ฐ€๋…์„ฑ ์ข‹์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

2024๋…„ 1์›” 29์ผAbout 1 minNode.jsNPMArticle(s)blogyozm.wishket.comjsjavascriptnpmfaker.js

๊ฐ€๋…์„ฑ ์ข‹์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ด€๋ จ

Node.js > Article(s)

Article(s)

๊ฐ€๋…์„ฑ ์ข‹์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• | ์š”์ฆ˜IT
ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ฐฑ์—”๋“œ ์˜์—ญ๊ณผ ๋‹ฌ๋ฆฌ, ํŒ€์˜ ๊ฐœ๋ฐœ ๋ฌธํ™”๋กœ ์ž๋ฆฌ ์žก๊ฑฐ๋‚˜ ๊ฐœ์ธ์ด ์ต์ˆ™ํ•ด์งˆ ์ •๋„์˜ ๋‹จ๊ณ„๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์€๋ฐ์š”. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ €๋งˆ๋‹ค์˜ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๊ฐ€๋…์„ฑ์ด ์ค‘์š”ํ•œ ๋งŒํผ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์„์ง€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ํŒ์— ๊ด€ํ•ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ์˜์—ญ์—์„œ๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ฑ„์šฉ๊ณต๊ณ ๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉด Cypress, Jest, testing-library ๋“ฑ์˜ ํ…Œ์ŠคํŠธ ๊ธฐ์ˆ ์ด ์ ํ˜€์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ฐฑ์—”๋“œ ์˜์—ญ๊ณผ ๋‹ฌ๋ฆฌ, ํŒ€์˜ ๊ฐœ๋ฐœ ๋ฌธํ™”๋กœ ์ž๋ฆฌ ์žก๊ฑฐ๋‚˜ ๊ฐœ์ธ์ด ์ต์ˆ™ํ•ด์งˆ ์ •๋„์˜ ๋‹จ๊ณ„๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์€๋ฐ์š”.

๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ €๋งˆ๋‹ค์˜ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๊ฐ€๋…์„ฑ์ด ์ค‘์š”ํ•œ ๋งŒํผ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์„์ง€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ํŒ์— ๊ด€ํ•ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์—ญํ• 

๋จผ์ € ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ธฐ ์ „, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ์š”. ์šฐ๋ฆฌ๋Š” ์™œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๊นŒ์š”? ๊ทธ ์ด์œ ๋Š” ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ด์™ธ์—๋„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋ฌธ์„œ๋กœ์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ๋ˆ„๊ตฐ๊ฐ€ ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š”๋‹ค๊ณ  ํ•  ๋•Œ, ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋” ๋‚˜์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ง€๊ธˆ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ œ๋ชฉ ์ž‘์„ฑ ํŒ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š” ์ œ๋ชฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ธ๋ฐ์š”. ์ €๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ•์„ ๋ฌป๋Š” ๋™๋ฃŒ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ฑ…์˜ ๋ชฉ์ฐจ๋ฅผ ์“ฐ๋“ฏ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ๊ณ  ์กฐ์–ธํ•ด ์ค๋‹ˆ๋‹ค.

์ฑ…์€ ๋ชฉ์ฐจ๋งŒ ์ฝ์–ด๋„ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. <์ถœ์ฒ˜: DALLยทE ์ƒ์„ฑ ์ด๋ฏธ์ง€>
์ฑ…์€ ๋ชฉ์ฐจ๋งŒ ์ฝ์–ด๋„ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. <์ถœ์ฒ˜: DALLยทE ์ƒ์„ฑ ์ด๋ฏธ์ง€>

A๋ฅผ ๋งŒ์กฑํ•˜๋ฉด B๊ฐ€ ๋„์ถœ๋˜๋Š” ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ

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

๊ทธ๋ž˜์„œ ์ œ๋ชฉ์€ A๋ฅผ ๋งŒ์กฑํ•˜๋ฉด B๊ฐ€ ๋„์ถœ๋˜๋Š” ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณผ๊ฒŒ์š”.

Bad
// Bad
test("๊ตฌ๋งค ๋ฒ„ํŠผ ํด๋ฆญ", () => {
  render(<SignUpForm />);
  const purchaseButton = screen.queryByTestId("data-submit-button")!;
  const modal = screen.queryByTestId("modal");

  expect(modal).not.toBeInDocument();
  purchaseButton.click();
  expect(modal).toBeInDocument();
})

์œ„ ์‚ฌ๋ก€์˜ ์ œ๋ชฉ์„ ๊ตฌ๋งค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ชจ๋‹ฌ์ด ๋„์›Œ์ง„๋‹ค๊ณ  ๋ณ€๊ฒฝํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ๋ˆˆ์— ์ž˜ ๋“ค์–ด์˜ค์ง€ ์•Š๋‚˜์š”? ์ œ๋ชฉ๋งŒ ๋ฐ”๊ฟจ์„ ๋ฟ์ธ๋ฐ ํ›จ์”ฌ ์•Œ๊ธฐ ์‰ฌ์šด ํ…Œ์ŠคํŠธ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋‚ฏ์„ค๋‹ค๋ฉด, ์šฐ์„  ์ œ๋ชฉ์„ ๋ฐ”๊พธ๋Š” ์—ฐ์Šต๋ถ€ํ„ฐ ํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ์ž‘์„ฑํ•˜๊ธฐ

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

์ด๋Ÿด ๋•Œ๋Š” ์ œ๋ชฉ๊ณผ ์—ฐ๊ด€๋œ ์ ์„ ๋ถ„๋ฅ˜๋ณ„๋กœ ๋‚˜๋ˆ„๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฑ…์˜ ๋ชฉ์ฐจ๋„ ์ฑ•ํ„ฐ๊ฐ€ ์žˆ๊ณ , ๊ฐ ์ฑ•ํ„ฐ๋ณ„๋กœ ๋‹ค์‹œ ์†Œ์ œ๋ชฉ์ด ์žˆ๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹œ๊ฐ์ ์ธ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bad
// Bad
describe("SignUp Page", () => {
  test("ํšŒ์›๊ฐ€์ž… ํผ์ด ๋ Œ๋”๋ง ๋  ๋•Œ, ์•„์ด๋””๋ž€์ด ๋น„์–ด์žˆ์œผ๋ฉด, ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•œ๋‹ค", () => {
    // โ€ฆ
  })
  test("ํšŒ์›๊ฐ€์ž… ํผ์ด ๋ Œ๋”๋ง ๋  ๋•Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ž€์ด ๋น„์–ด์žˆ์œผ๋ฉด, ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•œ๋‹ค", () => {
    // โ€ฆ
  })
})

์œ„์™€ ๊ฐ™์ด ์ œ๋ชฉ์„ ๋™์ผํ•œ ๋ถ„๋ฅ˜๋กœ ๋ฌถ์–ด ์ƒ์œ„์— ์ž‘์„ฑํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ œ๋ชฉ์„ ์ž˜ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.

1๋ฒˆ๋ถ€ํ„ฐ 3๋ฒˆ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์—ˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ์ฝํžˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.<br/><์ถœ์ฒ˜: ์š”์ฆ˜ IT>
1๋ฒˆ๋ถ€ํ„ฐ 3๋ฒˆ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์—ˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ์ฝํžˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
<์ถœ์ฒ˜: ์š”์ฆ˜ IT>

ํ•œ ๊ฐ€์ง€ ํŒ์„ ๊ณต์œ ํ•ด ๋ณผ๊ฒŒ์š”. ํ…Œ์ŠคํŠธ ์ œ๋ชฉ์˜ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์— ์žˆ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ ์šฉ๋œ ์ฐจ๋ก€๋Œ€๋กœ 2, 3๋ฒˆ์„ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์—ˆ์„ ๋•Œ, ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ์™„์„ฑ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๋ฉด ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

  • SignUp Page, ํšŒ์›๊ฐ€์ž… ํผ์ด ๋ Œ๋”๋ง ๋  ๋•Œ, ์•„์ด๋””๋ž€์ด ๋น„์–ด์žˆ์œผ๋ฉด, ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•œ๋‹ค.
  • SignUp Page, ํšŒ์›๊ฐ€์ž… ํผ์ด ๋ Œ๋”๋ง ๋  ๋•Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ž€์ด ๋น„์–ด์žˆ์œผ๋ฉด, ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•œ๋‹ค.

์™„๋ฒฝํ•œ ๋ฌธ์žฅ์€ ์•„๋‹ˆ๋”๋ผ๋„ ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.


Given-When-Then ๋ฒ•์น™ ์ด์šฉํ•˜๊ธฐ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์—„์ฒญ๋‚œ ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„ ๋ฒ•์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ โ€˜Given-When-Thenโ€™ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฒ•์น™์ž…๋‹ˆ๋‹ค.

Given-When-Then์€ ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฐ™๋‹ค. <์ถœ์ฒ˜: DALLยทE ์ƒ์„ฑ ์ด๋ฏธ์ง€>
Given-When-Then์€ ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฐ™๋‹ค. <์ถœ์ฒ˜: DALLยทE ์ƒ์„ฑ ์ด๋ฏธ์ง€>

์ด๋ ‡๊ฒŒ 3๋‹จ๊ณ„๋กœ ์ด๋ค„์ง„ ๊ฐ„๋‹จํ•œ ๋ฒ•์น™๋งŒ ์ ์šฉํ•ด๋„, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋†€๋ผ์šธ ๋งŒํผ ์ข‹์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด ๋ณด์„ธ์š”
describe("calculator", () => {
  test("3 adds 5 equals 8", () => {
    // Given - ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์ค€๋น„๋ฌผ ์ƒ์„ฑ
    const num1 = 3;
    const num2 = 5;

    // When - ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์„ ์ˆ˜ํ–‰
    const result = add(num1, num2);

    // Then - ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆ
    expect(result).toBe(num1 + num2);
  })
})

์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ Given, When, Then์„ ์ฃผ์„๊ณผ ํ•จ๊ป˜ ์˜์—ญ์„ ๋ถ„๋ฆฌํ•ด ์ฃผ๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ธฐ๋Šฅ์ด ๋ณต์žกํ•ด์ง€๋ฉด, ์ฝ”๋“œ๋„ 100~200์ค„์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ์š”. ์ด๋Ÿด ๋•Œ ์˜์—ญ์„ ํ™•์‹คํ•˜๊ฒŒ ๋‚˜๋ˆ  ์ฃผ๋ฉด ์ฝ๊ธฐ๋„ ์‰ฝ๊ณ , ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์—๋„ ํŽธํ•ฉ๋‹ˆ๋‹ค.


ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ธฐ

๋Œ€๋ถ€๋ถ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋‚˜ ๊ฐ’์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”. ๋ฐ”๋กœ ์œ„์—์„œ ์‚ดํŽด๋ณธ ์˜ˆ์‹œ์—์„œ๋„ num1๊ณผ num2์— 3, 5๋ผ๋Š” ๊ฐ’์„ ์ง์ ‘ ํ• ๋‹นํ•ด ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด add ํ•จ์ˆ˜๋Š” ์ž„์˜๋กœ ์„ค์ •ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ’ A, B์— ๊ด€ํ•œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ฐœ๋ฐœ์ž๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ๋งŒ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด, ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฒ”์œ„์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์„ ์žก์•„๋‚ด๊ธฐ ํž˜๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋˜๋„๋ก ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ž„์˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ @faker-js/faker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํ™ฉ๋ณ„๋กœ ์ ํ•ฉํ•œ ์ž„์˜ ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐœ๋ฐœ ์˜์กด์„ฑ(devdependency)์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

// faker.js ๋ฅผ ์‚ฌ์šฉํ•ด ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋‹ค์‹œ ์žฌ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
import { faker } from '@faker-js/faker';

describe("calculator", () => {
  test("A adds B equals A+B", () => {
    // Given - ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์ค€๋น„๋ฌผ ์ƒ์„ฑ
    // faker.number.int ๋Š” ์ž„์˜์˜ ์ •์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    const num1 = faker.number.int();
    const num2 = faker.number.int();

    // When - ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์„ ์ˆ˜ํ–‰
    const result = add(num1, num2);

    // Then - ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆ
    expect(result).toBe(num1 + num2);
  })
})

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


๋งˆ์น˜๋ฉฐ

์ง€๊ธˆ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์™ธ์—๋„ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ, ์ œ๊ฐ€ ์‹œ๋„ํ•ด ๋ณธ ๊ฒฐ๊ณผ ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ตœ๋Œ€ํ•œ์˜ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฐฉ๋ฒ• ์œ„์ฃผ๋กœ ์†Œ๊ฐœํ•ด ๋ณด์•˜๋Š”๋ฐ์š”. ์ด๋ฅผ ์ฐธ๊ณ ํ•ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ ์šฉํ•ด ๋ณด๋ฉด์„œ, ์—ฌ๋Ÿฌ๋ถ„๋„ ๋ณธ์ธ๋งŒ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋…ธํ•˜์šฐ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐˆ ์ˆ˜ ์žˆ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.