๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
TestCode

[Test] ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ

by DevIseo 2023. 2. 1.

ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ

 ๐Ÿ’ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ผ๋ จ์˜ ๋ชจ๋“  ํ–‰์œ„

 

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

 

์ข‹์€ ํ…Œ์ŠคํŠธ๋ž€?

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰

  • ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋‚˜ ์‹คํ–‰ ์—ฌ๋ถ€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰

ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋Š” ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•จ

  • ํ…Œ์ŠคํŠธ๋Š” ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ์ƒ๊ด€์—†์ด ์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰
  • ์ ์ ˆํ•œ ๋ชจํ‚น์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ OS, ๋„คํŠธ์›Œํฌ ๋˜๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”
    • ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ๋ชจํ‚นํ•  ํ•„์š”๋Š” ์—†์Œ

๋‚ด๋ถ€ ๊ตฌํ˜„์— ์ข…์†๋œ ํ…Œ์ŠคํŠธ๋Š” ์ง€์–‘

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

ํ…Œ์ŠคํŠธ๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•จ

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

์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ

  • ํ•„์š” ์ด์ƒ์œผ๋กœ ๋„ˆ๋ฌด ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์ทจ์•ฝํ•ด ์œ ์ง€ ๋ณด์ˆ˜ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ฒŒ ๋จ
  • ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ…Œ์ŠคํŠธ ํ•˜๋ ค๋Š” ๋Œ€์ƒ์˜ ๋ฌธ๋งฅ ์•ˆ์—์„œ ์ ์ ˆํ•œ ๋ฒ”์œ„๋กœ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑ

 

TDD(Test Driven Development)

; ํ…Œ์ŠคํŠธ ์ฃผ๋„์˜ ๊ฐœ๋ฐœ

๊ฐœ๋ฐœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๊นจ์ง€๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ์ง€์†์ ์ธ ๋ฆฌํŒฉํ† ๋ฆฌ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฒ€์ฆ๋˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก 

TDD Cycle

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

 

ํ…Œ์ŠคํŠธ์˜ ์œ ํ˜•

์ •์ (Static) ํ…Œ์ŠคํŠธ, ๋‹จ์œ„(Unit) ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ(Integration) ํ…Œ์ŠคํŠธ, E2E(End to End) ํ…Œ์ŠคํŠธ

Static Test ; ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒƒ

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

Unit Test ; ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๊ฐ ๋ชจ๋“ˆ์„ ๋‹จ๋… ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ

  • ์˜์กด์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธํ•˜๋Š” Sociable ํ…Œ์ŠคํŠธ & ๋ชจ๋“ˆ์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ๋”๋ธ”๋กœ ๋Œ€์ฒดํ•˜๋Š” Solitary ํ…Œ์ŠคํŠธ
  • ex) ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ด์„œ ๊นจ์ง€์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ
    • Sociable ํ…Œ์ŠคํŠธ๋Š” ์ž์‹(child) ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ํฌํ•จํ•ด์„œ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ
    • Solitary ํ…Œ์ŠคํŠธ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจํ‚นํ•ด์„œ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ

Integration test ; ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ชจ๋“ˆ์ด ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ

  • ๋ชจ๋“ˆ ๊ฐ„์˜ ์—ฐ๊ฒฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ณด๋‹ค ๋น„๊ต์  ๋„“์€ ๋ฒ”์œ„์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํŒฉํ† ๋ง์— ์‰ฝ๊ฒŒ ๊นจ์ง€์ง€ ์•Š๋Š” ์žฅ์ 
  • ํ…Œ์ŠคํŠธ ๋”๋ธ”์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ broad test์™€ narrow test๋กœ ๊ตฌ๋ถ„
    • broad test๋Š” ์˜์กด์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์ด ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ
    • narrow test๋Š” ์—ฐ๊ฒฐ๋œ ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธ ๋”๋ธ”๋กœ ๋Œ€์ฒดํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ
  • ex) ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” UI์™€ API ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ผ์–ด๋‚˜๋Š”์ง€, ๋˜๋Š” state์— ๋”ฐ๋ฅธ UI์˜ ๋ณ€๊ฒฝ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ
    • ์‹ค์ œ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ broad test๋ฅผ ํ•˜๊ฑฐ๋‚˜ API client๋ฅผ ๋ชจํ‚น(mocking) ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ƒ API ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•จ์œผ๋กœ์จ narrow test๋ฅผ ์ˆ˜ํ–‰

E2E Test ; ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ ๋ฐ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ

  • ํ”„๋ก ํŠธ์—”๋“œ์—์„œ E2E ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ
  • ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋†’๊ณ  ์‹ค์ œ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ๋ฅผ ๊ฒ€์ถœํ•  ์ˆ˜ ์žˆ๋‹จ ์žฅ์ 
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„์šฐ๊ธฐ ๋•Œ๋ฌธ์— Web API๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—๋„ ๋น„๊ต์  ์ž˜ ๊นจ์ง€์ง€ ์•Š๋Š” ์žฅ์ 
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์œ„, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ณด๋‹ค ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ฆผ
  • ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค(๋„คํŠธ์›Œํฌ ์—๋Ÿฌ ๋“ฑ)๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์–ด์„œ E2E ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๋ขฐํ•˜๊ธฐ ์–ด๋ ค์›€

 

 

ํ…Œ์ŠคํŠธ ๋Œ€์ƒ

์‹œ๊ฐ์  ์š”์†Œ, ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, API ํ†ต์‹ 

์‹œ๊ฐ์  ์š”์†Œ

  • ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ
    • HTML ๊ตฌ์กฐ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธ
    • Jest
  • ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Test)
    • HTML์— CSS๋ฅผ ๋”ํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง ๋˜๋Š” ๋ชจ์Šต์ด ์˜๋„ํ•œ ๋Œ€๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธ
    • Storybook์—์„œ ๋งŒ๋“  Chromatic

์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ API ๋˜๋Š” React์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ™œ์šฉ or E2E ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์ƒ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ
    • ์‚ฌ์šฉ์ž์˜ ๋งˆ์šฐ์Šค, ํ‚ค๋ณด๋“œ ๋“ฑ์˜ ์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ์ ์ ˆํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… ํ…Œ์ŠคํŠธ
  • Node.js ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ

API ์„œ๋ฒ„ ํ†ต์‹ 

  • ์‹ค์ œ API ์„œ๋ฒ„
    • E2E ํ…Œ์ŠคํŠธ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • ํ…Œ์ŠคํŠธ API ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ API client๋ฅผ ๋ชจํ‚น
    • API client๋ฅผ ๋ชจํ‚นํ•˜๋ฉด API ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ 
    • Jest๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ์„ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจํ‚นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— testing-library์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Jest๋ฅผ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ ํ™œ์šฉํ•  ๊ฒƒ์„ React ํŒ€์—์„œ ๊ถŒ์žฅ

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์–ด๋””์—์„œ ์‹คํ–‰๋˜๋Š”์ง€์— ๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ Node.js ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌ๋ถ„

๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ

  • ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ชจ๋“  Web API์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ๋ฐ ๊ธฐ๊ธฐ ํ˜ธํ™˜์„ฑ ํ…Œ์ŠคํŠธ๋„ ์ง„ํ–‰ ๊ฐ€๋Šฅ
  • ๋ธŒ๋ผ์šฐ์ €์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ Node.js ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋ฌด๊ฒ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ฆผ
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ๋Ÿฐ์ฒ˜๋ฅผ ๋ณ„๋„๋กœ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ
  • ์†๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด UI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ์™ธํ•œ Headless ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉ
  • ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜์–ด ๋ฐฐํฌํ•  ๋•Œ CI์™€ ์—ฐ๋™ํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ์‹์ด ๊ถŒ์žฅ

Node.js ํ™˜๊ฒฝ

Trade off

React ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ Node.js ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ์„ค๋ช…

TOAST UIํŒ€(์ฐธ๊ณ )


๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ; ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ๋˜๋Š” ๋ Œ๋”๋ง, ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋“ฑ ๋ธŒ๋ผ์šฐ์ €์˜ ์‹ค์ œ ๋™์ž‘์„ ํ…Œ์ŠคํŠธ

Node.js ํ™˜๊ฒฝ; ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ

Testing Tools

๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ

Testcafe ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•, ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ์— ํŠนํ™”๋œ E2E ํ…Œ์ŠคํŠธ ๋„๊ตฌ

Node.js ํ™˜๊ฒฝ

Jest ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋“ค์ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์™€ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต

Testing library UI๋ฅผ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

Reference

์ด์žฌ์„ฑ ์ €, ใ€Œ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์™„์„ฑ๊นŒ์ง€, ํ”„๋ŸฐํŠธ์—”๋“œใ€, ๋น„์ œ์ดํผ๋ธ”๋ฆญ(2021)

๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ „๋žตโ€Š-โ€Š1ํŽธ

๋Œ“๊ธ€