TDD(Test Driven Development)

TDD๋ฅผ ์•Œ์•„๋ณด์ž


๐Ÿง TDD๋ž€?

TDD๋ž€ Test Driven Development์˜ ์ค„์ž„๋ง๋กœ ๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

TDD์˜ ๋ชฉํ‘œ๋Š” ์ž‘๋™ํ•˜๋Š” ๊น”๋”ํ•œ ์ฝ”๋“œ โ€œClean code that worksโ€์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์›์น™์„ ์ œ์‹œํ•œ๋‹ค.

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

๐Ÿค” Why TDD?

๊ธฐ์กด๋ฐฉ์‹์˜ ์ž ์žฌ์  ์œ„ํ—˜

์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ -> ์„ค๊ณ„ -> ๊ฐœ๋ฐœ -> ํ…Œ์ŠคํŠธ -> ๋ฐฐํฌ 

์œ„ ๊ฐœ๋ฐœ๋ฒ•์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ๋Š๋ฆฌ๊ฒŒ ํ•˜๋Š” ์ž ์žฌ์  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค

  • ์†Œ๋น„์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•œ ์„ค๊ณ„๋Š” ์–ด๋ ต๋‹ค.
  • ์„ค๊ณ„ -> ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด ์‹ค์ œ ์ฝ”๋“œ์™€ ์„ค๊ณ„๊ฐ„ ๊ฐˆ๋“ฑ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๊ณณ์˜ ์ˆ˜์ •์ด ๋‹ค๋ฅธ ๊ณณ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ํ™•์ธ ๋ฐ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ์ •์ƒ ๋„์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๋ถˆํ™•์‹ค์„ฑ์ด ๋†’์„ ๋•Œ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ˜‘๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค.

  • ๋ถˆํ™•์‹ค์„ฑ์ด ๋†’์„ ๋•Œ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ˜‘๋ ฅ์„ ์ด์šฉํ•˜๋ฉด ๋” ์ข‹์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ํ™•๋ฅ ์ด ๋†’์•„์ง„๋‹ค.
  • TDD๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ˜‘๋ ฅ์„ ์ฆ์ง„์‹œํ‚ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ™•์‹ค์„ฑ์ด ๋†’์„ ๋•Œ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ˜ฎ When TDD?

๊ฐœ๋ฐœ์‹œ ์–ด๋–ค ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ฝ”๋”ฉ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด๋ดค๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜์˜ฌ์ง€ ๋ป”ํ•˜๋‹ค๋ฉด TDD๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋˜ํ•œ TDD๋ฅผ ํ–ˆ์„ ๋•Œ ์–ป๋Š” ๊ฒƒ์ด ์ ๋‹ค๋ฉด TDD๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

TDD๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

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

์ฆ‰ ๋ถˆํ™•์‹ค์„ฑ์ด ๋†’์„ ๋•Œ TDD๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

๐Ÿ˜Ž ์žฅ๋‹จ์ 

์žฅ์ 

  • ๊ฐœ๋ฐœ์ž์˜ ๋ฐฉํ–ฅ์„ ์žƒ์ง€ ์•Š๊ฒŒ ์œ ์ง€ : ํ˜„์žฌ ์ž์‹ ์˜ ๊ฐœ๋ฐœ ๋‚ด์šฉ ๋ฐ ์ง„์ฒ™ ์ƒํ™ฉ์„ ํ•ญ์ƒ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ’ˆ์งˆ ๋†’์€ ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ ๋ณด์œ  : ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์œ ์ง€ ๊ฐ€๋Šฅ
  • ์ž๋™ํ™”๋œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์†Œ์œ  : ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์–ธ์ œ๋“  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ์˜ ์ด์ƒ ์œ ๋ฌด๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์„ค๋ช…์„œ & ์˜์‚ฌ ์†Œํ†ต์˜ ์ˆ˜๋‹จ : ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์ œํ’ˆ ์ฝ”๋“œ ์‚ฌ์šฉ ์„ค๋ช…์„œ์ด์ž ๋™์‹œ์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ์†Œํ†ตํ•˜๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํ†ต๋กœ๊ฐ€ ๋œ๋‹ค.
  • ๊ฒฐํ•จ์ด ์ค„์–ด๋“ ๋‹ค.

๋‹จ์ 

  • ๊ฐœ๋ฐœ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚œ๋‹ค.
  • ํ•œ๊ณ„
    • ๋™์‹œ์„ฑ(Concurrency)
    • ๋ณด์•ˆ ๋“ฑ์˜ ๋น„๊ธฐ๋Šฅ์  ์š”์†Œ

๐Ÿ’ก ๋ง‰์—ฐํ•œ ์ƒ๊ฐ์„ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

TDD PROCESS

TDD๋Š” ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๋ฐ˜๋ณต์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

  1. RED : ์‹คํŒจํ•˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ปดํŒŒ์ผ ์กฐ์ฐจ ์•ˆ๋  ์ˆ˜ ์žˆ๋‹ค.
  2. GREEN : ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  3. REFACTOR : ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์ฝ”๋“œ์˜ ๋ชจ๋“  ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ๋ถˆ๋ช…ํ™•ํ•œ ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค.

โ€œ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„ ์ธก์ •ํ•˜๊ธฐโ€ ์˜ˆ์ œ๋กœ ์‹œ์ž‘ํ•ด๋ณด์ž.

1๋‹จ๊ณ„ : ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ฒฐ์ •ํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ์ด ๊ณผ์ •์„ ํ•˜์ด๋ ˆ๋ฒจ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค. ๋‹น์žฅ์—๋Š” ๊ตฌํ˜„์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.

์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ: ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„์˜ ์ธก์ •. ์ด๋ฅผ ์œ„ํ•ด์„œ ๋ณดํ†ต์€ ์ž…๋ ฅ๊ฐ’๋“ค์ด ํ•„์š”ํ•˜๊ณ โ€ฆ ๋‹ค์Œ์œผ๋กœ, ๊ทธ์— ๊ทผ๊ฑฐํ•œ ์ถœ๋ ฅ๊ฐ’์„ ์–ป์„ ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๋ชฉํ‘œ๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด, ์•„๋งˆ ๋‹น์‹ ์€ ํ•จ์ˆ˜๋กœ ์šด์„ ๋—„ ๊ฒƒ์ด๋‹ค.

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

์šฐ๋ฆฌ๋Š” ๋˜‘๊ฐ™์ด ์ ˆ์ฐจ๋ฅผ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋‹ค โ€” ๋‹ค๋งŒ ์•„์ง์€ ์–ด๋–ค ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ?

  • ์ž…๋ ฅ๊ฐ’์€ ์‰ฝ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ.
  • ๊ฒฐ๊ณผ๊ฐ’๋„ ์‰ฝ๋‹ค. : ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ๊ฐ•๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์–ด๋–ค ๊ฐ’์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ฐ•๋ ฅํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๊ฑฐ๋‚˜ โ€” ์ฆ‰ boolean๊ฐ’์„ ์ถœ๋ ฅ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2๋‹จ๊ณ„: ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์„ ํƒํ•˜๊ธฐ

์ด์ œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š”์ง€ ์•Œ์•˜์œผ๋‹ˆ, ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค โ€” ์ฆ‰ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ์ทจํ•˜๋ฉฐ, ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ง€๋ฅผ ๋งํ•œ๋‹ค.

์ด๋ฒˆ ๊ณผ์ •๋„ TDD์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋‹น์‹ ์ด ์ฝ”๋“œ ์ž‘์„ฑ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•˜๋‹ค. ์–ด๋–ค ํ•จ์ˆ˜ ์ฝ”๋“œ๋“  ์ž‘์„ฑํ•˜๊ธฐ ์ „์—, ๋‹น์‹ ์€ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฌด์—‡์ด ๋  ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋จผ์ €, ๋งค๊ฐœ๋ณ€์ˆ˜. ์šฐ๋ฆฌ์˜ ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๋™์ž‘์„ ํ•ด์•ผํ• ๊นŒ? ์ด ๊ฒฝ์šฐ์—๋Š” ๊ฐ„๋‹จํ•œ๋ฐ โ€” ํ•„์š”ํ•œ ๊ฒƒ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฟ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ’์—๋งŒ ์˜์กดํ•ด ๋ชจ๋“  ์ธก์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’์€ ์–ด๋–จ๊นŒ? ์ธก์ •์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•œ๋ฐ, ๊ฒฐ๊ณผ๋ฅผ ๊ณง์žฅ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณด๋‹ค ๋ณต์žกํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด, ๋ฐ˜ํ™˜๊ฐ’์€ Promise๊ฐ€ ๋œ๋‹ค. ๋˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹ , ์ฝœ๋ฐฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ทจํ•˜๊ฑฐ๋‚˜ โ€” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์–ด์จŒ๋“ ๊ฐ„์—, ์ด ์‹œ์ ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

var strong = isStrongPassword(โ€˜password string goes hereโ€™);

3๋‹จ๊ณ„: ๊ธฐ๋Šฅ์ƒ ์•„์ฃผ ์ž‘์€ ํ•˜๋‚˜์˜ ๊ด€์ ์œผ๋กœ ํŒ๋‹จํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ชฉํ‘œ, ๊ด€๋ จ ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์•Œ๊ณ ์žˆ๋‹ค.

TDD๊ฐ€ ์•„๋‹Œ ๋ฐฉ์‹์ด๋ผ๋ฉด, ๋‹น์‹ ์€ ์ฝ”๋“œ ์ž‘์„ฑ์— ๋Œ์ž…ํ•  ๊ฒƒ์ด๋‹ค.

์ด๋ฏธ ๋‹น์‹ ์—๊ฒ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ช‡๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค โ€” ์ด๊ฑธ ํ™•์ธํ•ด์•ผ ํ•˜๊ณ , ์ €๊ฑธ ํ™•์ธํ•ด์•ผํ•˜๊ณ , ๋ฐ˜ํ™˜๊ฐ’์€ X์— ์˜ํ•ด ์˜ํ–ฅ๋ฐ›๊ณ โ€ฆ

TDD์— ์žˆ์–ด์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๊ณค๋ž€์— ๋น ์ง€๋Š” ์ง€์ ์ด ์—ฌ๊ธฐ๋‹ค.

๋‹น์‹ ์˜ ๋จธ๋ฆฟ์†์€ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ์ƒ๊ฐ๋“ค๋กœ ๊ฐ€๋“์ฐผ์ง€๋งŒ ์ž‘์„ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ๋‹น์‹ ์€ ์ฝ”๋“œ๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•  ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋‹ค.

๋ชจ๋“  ์„ ํƒ์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋Œ€์‹ ์—โ€ฆ ๊ทธ๋ƒฅ ์ž‘์€ ๊ฒƒ์—๋งŒ ์ง‘์ค‘ํ•ด๋ณด์ž. ๋ชฉํ‘œ์— ์•„์ฃผ ์กฐ๊ธˆ ๋‹ค๊ฐ€๊ฐ€๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ, ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋™์ž‘์€ ๋ญ˜๊นŒ?

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

๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„ ์ธก์ •์ด๋ผ๋Š” ๊ถ๊ทน์ ์ธ ๋ชฉํ‘œ์— ๋„๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์ ˆ์ฐจ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๋งŒ์•ฝ TDD์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด, ๋งจ ์ฒซ ์ค„(์•„๋‹ˆ๋ฉด ๋‘๋ฒˆ์งธ)์€ ๋ฌด์—‡์ด ๋ ๊นŒ? ๋ช‡ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์— ๊ฐ€๊นŒ์›Œ์งˆ ์ˆ˜ ์žˆ์„๊นŒ? ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„์— ๊ด€ํ•ด ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ทœ์น™์€ ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค. ์ด๊ฑด ๋งค์šฐ ์‰ฝ๋‹ค โ€” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ์ถœ๋ ฅ๊ฐ’์€ ์–ธ์ œ๋‚˜ false์—ฌ์•ผ ํ•œ๋‹ค.

4๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

์šฐ์—ฌ๊ณก์ ˆ ๋์—, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌํ˜„๊นŒ์ง€ ์™”๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๋‹ค ๋Š๋ผ๊ธธ ๋ฐ”๋ž€๋‹ค :)

์•ž์„  ๊ณผ์ •๋“ค์ด TDD์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ๋น„์Šทํ•œ ๊ฑธ ์•Œ๊ฒ ๋Š”๊ฐ€?

์ฃผ๋œ ์ฐจ์ด์ ์€ ํ•จ์ˆ˜ ๊ตฌํ˜„ ๋Œ€์‹ , ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ง€์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰ โ€” ์–ด๋–ค ์กฐ๊ฑด ํ•˜์—์„œ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•จ์ˆ˜์˜ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ฐ•๋ ฅํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์Œ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ boolean์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

๋˜ํ•œ ๋นˆ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด, ๊ฒฐ๊ณผ๊ฐ’์€ ํ•ญ์ƒ false๋ผ๊ณ  ์ •ํ–ˆ๋‹ค โ€” ๋นˆ ๋ฌธ์ž์—ด ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•ฝํ•จ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ.

์ด์ œ ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์—ฐ๊ฒฐํ•ด๋ณด์ž

describe('isPasswordStrong', function() {
  it('should give negative result for empty string', function() {
    var password = '';
    var result = isPasswordStrong(password);
    expect(result).to.be.false;
  });
});

ํ•จ์ˆ˜์˜ ํ•œ์ค„ ํ•œ์ค„์„ ๋ชจ๋ฅธ ์ฑ„๋กœ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์ž.

์šฐ๋ฆฌ๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋ฉด, ๊ฒฐ๊ณผ๊ฐ’์€ false๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋‹จ์ˆœํ•œ ๋™์ž‘์ด๋‹ค.

5๋‹จ๊ณ„: ์ฝ”๋“œ ๊ตฌํ˜„

์„ค๋ช…์ด ํ•„์š”์—†๋‹ค. ๋‹จ์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€ํ•œ๋‹ค.

function isPasswordStrong(password) {
  if(!password) {
    return false;
  }
}

๊ณ„์†ํ•ด์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„ ์ธก์ • ํ•จ์ˆ˜๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๋ƒฅ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.

์šฐ๋ฆฌ๋Š” 3๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ€์„œ, ์•„์ฃผ ์ž‘์€ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์„ ํƒํ•  ๊ฒƒ์ด๋‹ค. 4๋‹จ๊ณ„, ํ…Œ์ŠคํŠธ ๋กœ์ง ์ถ”๊ฐ€. 5๋‹จ๊ณ„, ๊ตฌํ˜„. ๋ฐ˜๋ณต.

์ด๋Ÿฐ ์ž‘์€ ์ ˆ์ฐจ๋“ค์„ ๊ฑฐ๋“ญํ•ด์„œ ์ „์ง„ํ•˜๋‹ค๋ณด๋ฉด, ๊ฐ‘์ž๊ธฐ TDD๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค โ€” ๊ฒฐ๊ตญ์—” ์•„์ฃผ ์งง์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ช‡๋ฒˆ์˜ ํ…Œ์ŠคํŠธ๋กœ ๋๋‚  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค.

TDD๋Š” ๋‹น์‹ ์ด ์ž‘์„ฑํ•  ๋ฒ•ํ•œ ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์—ฌ์คŒ์œผ๋กœ์จ ๋„์›€์ด ๋œ๋‹ค, ์™œ๋ƒํ•˜๋ฉด ๋‹น์‹ ์ด ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ์— ์˜ํ•ด ๊ฒ€์ฆ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Thanks to

์ฐธ๊ณ  : Parkโ€™s Park - Test-Driven Development

์ฐธ๊ณ  : heejeong Kwon - [Agile] TDD(ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)๋ž€

์ฐธ๊ณ  : cmygray - [๋ฒˆ์—ญ]์‰ฌ์šด ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ 5๋‹จ๊ณ„ ๋ฐฉ๋ฒ•๋ก 


ยฉ 2019. All rights reserved.