Skip to content

Files

243 lines (169 loc) ยท 12.2 KB

TDD.md

File metadata and controls

243 lines (169 loc) ยท 12.2 KB

TDD

TDD๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

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

Test Driven Development์˜ ์•ฝ์ž๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ , ์‹ค์ œ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ๋‚˜์ค‘์— ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

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

์งง์€ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ์˜ ๋ฐ˜๋ณต์— ์˜์กดํ•˜๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์ด๋ฉฐ ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜์ธ eXtream Programming(XP)์˜ Test-First๊ฐœ๋…์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋‹จ์ˆœํ•œ ์„ค๊ณ„๋ฅผ ์ค‘์š”์‹œํ•œ๋‹ค.

eXtream Programming(XP) ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ์˜ˆ์ธก์„ ์ตœ๋Œ€ํ•œ ํ•˜์ง€ ์•Š๊ณ , ์ง€์†์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ์™„์„ฑํ•˜๋Š” ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•๋ก ์€ ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋”๋ผ๋„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

TDD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

๋จผ์ € test code๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ 

  • ๋ณ€ํ™”์— ๋Œ€ํ•œ ๋‘๋ ค์›€์„ ์ค„์—ฌ์ค€๋‹ค.(๋ฆฌํŒฉํ† ๋ง์ด ํŽธํ•˜๋‹ค.)
  • ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค€๋‹ค.
  • ๋™์ž‘ํ•˜๋Š” ๋ฌธ์„œ ์—ญํ• ์„ ํ•œ๋‹ค.

TDD ๊ฐœ๋ฐœ ์ฃผ๊ธฐ

tdd1

์œ„ ๊ทธ๋ฆผ์€ TDD์˜ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

  • Red
    • ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ๋‹ค.
  • Green
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์„ฑ๊ณต์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • Yellow
    • ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ, ์ผ๋ฐ˜ํ™” ๋“ฑ์˜ ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

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

์ผ๋ฐ˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹ vs TDD ๊ฐœ๋ฐœ ๋ฐฉ์‹

๐Ÿšฉ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹

tdd2

๋ณดํ†ต์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ -> ์„ค๊ณ„ -> ๊ฐœ๋ฐœ -> ํ…Œ์ŠคํŠธ -> ๋ฐฐํฌ์˜ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ๋А๋ฆฌ๊ฒŒ ํ•˜๋Š” ์ž ์žฌ์  ์œ„ํ—˜์ด ์กด์žํ•œ๋‹ค.

์ด์œ )

  • ์†Œ๋น„์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•œ ์„ค๊ณ„๋Š” ์–ด๋ ต๋‹ค.
  • ์ž์ฒด ๋ฒ„๊ทธ ๊ฒ€์ถœ ๋Šฅ๋ ฅ ์ €ํ•˜ ๋˜๋Š” ์†Œ์Šค์ฝ”๋“œ์˜ ํ’ˆ์งˆ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž์ฒด ํ…Œ์ŠคํŠธ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์ด ๋ฐœ์ƒ๋˜๋Š” ์ด์œ ๋Š” ๊ฐ„๋‹จํžˆ ์–ด๋А ํ”„๋กœ์ ํŠธ๋Š” ์ดˆ๊ธฐ ์„ค๊ณ„๊ฐ€ ์™„๋ฒฝํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž‘์€ ๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ ์ˆ˜์ •์—๋„ ๋ชจ๋“  ๋ถ€๋ถ„์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „์ฒด์ ์ธ ๋ฒ„๊ทธ๋ฅผ ๊ฒ€์ถœํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

๐Ÿšฉ TDD ๊ฐœ๋ฐœ ๋ฐฉ์‹

tdd3

TDD์™€ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค์— ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

๋””์ž์ธ(์„ค๊ณ„)๋‹จ๊ณ„์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชฉ์ ์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด์•ผํ•˜๊ณ , ๋˜ ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ์ง€ ๋ฏธ๋ฆฌ ์ •ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

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

TDD์˜ ๋Œ€ํ‘œ์ ์ธ Tool JUnit

Junit

ํ˜„์žฌ ์„ธ๊ณ„์ ์œผ๋กœ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” Java ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋‹ค. JUnit์„ ์‹œ์ž‘์œผ๋กœ CUnit(C์–ธ์–ด), CppUnit(C++), PyUnit(Python) ๋“ฑ xUnit ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

TDD ๊ฐœ๋ฐœ ๋ฐฉ์‹์˜ ์žฅ์ 

  • ๋ณด๋‹ค ํŠผํŠผํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ ์ƒ์‚ฐ
    • TDD๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ ๋ณด์žฅ์„ ๋ช…์‹œํ•˜๋ฏ€๋กœ TDD๋ฅผ ํ†ตํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์‹œ ๊ธฐ๋Šฅ ๋ณ„ ์ฒ ์ €ํ•œ ๋ชจ๋“ˆํ™”๊ฐ€ ์ด๋ค„์ง„๋‹ค. ์ด๋Š” ์ข…์†์„ฑ๊ณผ ์˜์กด์„ฑ์ด ๋‚ฎ์€ ๋ชจ๋“ˆ๋กœ ์กฐํ•ฉ๋œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ด๋„ ์†Œํ”„ํŠธ์›จ์–ด ์ „์ฒด ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
  • ์˜ค๋ฒ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐฉ์ง€
    • TDD๋ฅผ ํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ๊ฐœ๋ฐœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ˆ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ฝ”๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฏธ๋ž˜์— ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์€ ์ฝ”๋“œ ๊ตฌํ˜„ (X)
  • ์žฌ์„ค๊ณ„ ์‹œ๊ฐ„์˜ ๋‹จ์ถ•
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€๊ธˆ ๋ฌด์—‡์„ ํ•ด์•ผํ•˜๋Š”์ง€ ๋ถ„๋ช…ํžˆ ์ •์˜ํ•˜๊ณ  ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ์ง„ํ–‰ ์ค‘ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ „๋ฐ˜์ ์ธ ์„ค๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ผ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋””๋ฒ„๊น… ์‹œ๊ฐ„์˜ ๋‹จ์ถ•
    • ์ด๋Š” ์œ ๋‹› ํ…Œ์ŠคํŒ…์„ ํ•˜๋Š” ์ด์ ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜๋ชป ๋‚˜์˜จ๋‹ค๋ฉด DB์˜ ๋ฌธ์ œ์ธ์ง€, ๋น„์ฆˆ๋‹ˆ์Šค ๋ ˆ์ด์–ด์˜ ๋ฌธ์ œ์ธ์ง€ UI์˜ ๋ฌธ์ œ์ธ์ง€ ์‹ค์ œ ๋ชจ๋“  ๋ ˆ์ด๋Ÿฌ๋“ค์„ ์ „๋ถ€ ๋””๋ฒ„๊น… ํ•ด์•ผํ•˜์ง€๋งŒ, TDD์˜ ๊ฒฝ์šฐ ์ž๋™ํ™” ๋œ ์œ ๋‹›ํ…Œ์ŠคํŒ…์„ ์ „์žฌํ•˜๋ฏ€๋กœ ํŠน์ • ๋ฒ„๊ทธ๋ฅผ ์† ์‰ฝ๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์„ค๊ณ„์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์ด ๋น ๋ฅด๋‹ค.
    • ์„ค๊ณ„๋ฅผ ์ž˜๋ชปํ–ˆ์„ ๋•Œ ๋ณดํ†ต ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ ๊นจ๋‹ซ๊ฒŒ ๋œ๋‹ค.
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋ณต์žกํ•˜๊ณ  ์ž˜๋ชป๋œ ์„ค๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์ ์  ๋” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ์ถ”๊ฐ€ ๊ตฌํ˜„์˜ ์šฉ์ดํ•จ
    • ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋œ ์†Œํ”„ํŠธ์›จ์–ด์— ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ฐ€์žฅ ์šฐ๋ ค๋˜๋Š” ์ ์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๊ธฐ์กด ์ฝ”๋“œ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ TDD์˜ ๊ฒฝ์šฐ ์ž๋™ํ™”๋œ ์œ ๋‹› ํ…Œ์ŠคํŒ…์„ ์ „์ œํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ๊ธฐ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์žฅ์ ๋“ค์ด ์žˆ๋Š”๋ฐ ๋ชจ๋‘๊ฐ€ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฑธ๊นŒ??

TDD ๊ฐœ๋ฐœ ๋ฐฉ์‹์˜ ๋‹จ์ 

  • ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ๋ฐ”๋กœ ์ƒ์‚ฐ์„ฑ์˜ ์ €ํ•˜์ด๋‹ค.

    • ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— TDD์— ๋Œ€ํ•ด ๋ฐ˜์‹ ๋ฐ˜์˜ ํ•œ๋‹ค.
    • ์™œ๋ƒํ•˜๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ 2๊ฐœ์˜ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•˜๊ณ , ์ค‘๊ฐ„์ค‘๊ฐ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด์„œ ๊ณ ์ณ๋‚˜๊ฐ€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • TDD ๋ฐฉ์‹์˜ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์€ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ ๋ฐฉ์‹์— ๋น„ํ•ด ๋Œ€๋žต 10~30% ์ •๋„๋กœ ๋Š˜์–ด๋‚œ๋‹ค.
    • SI ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ’ˆ์งˆ๋ณด๋‹ค ๋‚ฉ๊ธฐ์ผ ์ค€์ˆ˜๊ฐ€ ํ›จ์”ฌ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— TDD ๋ฐฉ์‹์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

TDD๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค?

์ด๊ทœ์›๋‹˜์˜ ๋ง

  • TDD๋Š” ๋†’์€ ์‘์ง‘์„ ์œ ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • TDD๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์šฐ๋„ˆ์น™ ์œ„๋ฐฐ์— ์–ด๋–ค ์‹ ํ˜ธ๋„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • TDD๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ์„ ๋„์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • TDD์˜ ๋ฆฌํŒฉํ† ๋ง ๋‹จ๊ณ„๋Š” ์ข‹์€ ๊ตฌ์กฐ๋ฅผ ์•ˆ๋‚ดํ•˜๊ฑฐ๋‚˜ ์ข‹์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

-> TDD๊ฐ€ ์„ค๊ณ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋Š” ์•Š์ง€๋งŒ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์€ ์•„๋‹ˆ๋‹ค.

์ „์ ์œผ๋กœ TDD์—๋งŒ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ๋งŒ ํ•˜๊ธฐ ์ข‹์€ ์•ˆ์ข‹์€ ์„ค๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

TDD๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ

๋ง์…ˆ ๊ธฐ๋Šฅ์„ TDD๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž!

public class CalculatorTest {

  @Test
  void plus() {
    int result = Calculator.plus(1, 2);
    Assertions.assertEquals(3, result);
  }
}

์ž‘์„ฑ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ง์…ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฐ˜ํ™˜ ํƒ€์ž…์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  int result = Calculator.plus(1,2) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. assertEquals ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์˜ˆ์ƒ ๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋‹ˆ ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์ฝ”๋“œ์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  4. ๋‹ค์Œ๊ณผ ๊ฐ™์ด Calculator ํด๋ž˜์Šค์™€ plus ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค

public class Calculator {

  public static int plus(int a, int b) {
    return 0;
  }
}
  1. ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’์ด ๋‹ค๋ฅด๋‹ˆ ํ…Œ์ŠคํŠธ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

  2. ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๊ณ ์นฉ๋‹ˆ๋‹ค.

public class Calculator {

  public static int plus(int a, int b) {
    return 3;
  }
}
  1. ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
public class CalculatorTest {

  @Test
  void plus() {
    int result = Calculator.plus(1, 2);
    Assertions.assertEquals(3, result);
    Assertions.assertEquals(5, Calculator.plus(2, 3));
  }
}
  1. ํ…Œ์ŠคํŠธ๋Š” ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉฐ, ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
public class Calculator {

  public static int plus(int a, int b) {
    return a + b;
  }
}

๋ชจ๋“  ์˜ˆ์™ธ ์‚ฌํ•ญ๊ณผ ๊ธฐ๋Šฅ์„ ํ•œ ๋ฒˆ์— ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์™„์„ฑ๋œ๋‹ค๊ณ  ํ•ด๋„ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•  ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ณผ์ • ์†์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๊ณ  ์ฝ”๋“œ์˜ ํ’ˆ์งˆ๋„ ๋–จ์–ด์งˆ ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

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

๋‹จ์œ„ ํ…Œ์ŠคํŠธ

unit test: ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๊ธฐ์ค€์œผ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ

  • ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ
  • ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ ˆ์ฐจ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค
  • Unit Testing์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ชฉ์  ์ฝ”๋“œ์˜ ์™„์ „์„ฑ์„ ์ž…์ฆ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ทธ์ž์ฒด๋งŒ์œผ๋กœ ์ฃผ์š”ํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Œ

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Integration Test)๋Š” ๋ชจ๋“ˆ์„ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“ˆ ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค.

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

๊ทธ๋ ‡๊ธฐ์— ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์›น ํŽ˜์ด์ง€๋กœ๋ถ€ํ„ฐ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test) ์ž‘์„ฑ์˜ ํ•„์š”์„ฑ

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ๋„ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ…Œ์ŠคํŒ…์— ๋Œ€ํ•œ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ์— ์ˆ˜์‹œ๋กœ ๋น ๋ฅด๊ฒŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌํŒฉํ† ๋ง ์‹œ์— ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

TDD(Test-Driven Development, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ) ์—์„œ ์–˜๊ธฐํ•˜๋Š” ํ…Œ์ŠคํŠธ๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

FIRST ๋ฒ•์น™

  • F: Fast (๋น ๋ฅด๊ฒŒ)
    • ํ…Œ์ŠคํŠธ๋Š” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜์—ฌ ์ž์ฃผ ๋Œ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • I: Independent (๋…๋ฆฝ์ ์œผ๋กœ)
    • ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์ด๋ฉฐ ์„œ๋กœ ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    • ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋„ ์‹คํŒจํ•˜๊ฒŒ ๋˜์–ด ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • R: Repeatable (๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ฒŒ)
    • ์–ด๋А ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  • S: Self-Validating (์ž๊ฐ€ ๊ฒ€์ฆํ•˜๋Š”)
    • ํ…Œ์ŠคํŠธ๋Š” Boolean ๊ฐ’์œผ๋กœ (์„ฑ๊ณต/์‹คํŒจ) ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์–ด ์ž์ฒด์ ์œผ๋กœ ๊ฒ€์ฆ๋˜์–ด์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋ ‡์ง€์•Š๋‹ค๋ฉด ํŒ๋‹จ์„ ๋ณด๋Š” ์‚ฌ๋žŒ์ด ์ฃผ๊ด€์ ์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค.
  • T: Timely (์ ์‹œ์—)
    • ํ…Œ์ŠคํŠธ๋Š” ์ ์‹œ์— ์ฆ‰, ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ง์ „์— ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ 

TDD ์ •๋ฆฌ

10๋ถ„ ํ…Œ์ฝ”ํ†ก: TDD์™€ ๋‹จ์œ„ํ…Œ์ŠคํŠธ

TDD ๊ตฌํ˜„ ์˜ˆ์ œ

๋‹จ์œ„ ํ…Œ์ŠคํŠธ

๋ฉด์ ‘ ์งˆ๋ฌธ

  1. TDD๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?
  1. TDD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฅ์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?
  1. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๋ฒ•์น™์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?