๐Ÿš€ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD): ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ „๋žต ๐Ÿงช

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD): ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ „๋žต ๐Ÿงช

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ํ•  ๊ฑฐ์˜ˆ์š”. ๋ฐ”๋กœ "ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)"์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ๋ž๋‹ˆ๋‹ค. ์–ด๋จธ๋‚˜, TDD๋ผ๋‹ˆ! ๋ฌด์Šจ ์–ด๋ ค์šด ๊ฐœ๋…์ธ๊ฐ€ ์‹ถ์ฃ ? ใ…‹ใ…‹ใ…‹ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์šฐ๋ฆฌ ํ•จ๊ป˜ ์žฌ๋ฏธ์žˆ๊ฒŒ ์•Œ์•„๋ณผ ํ…Œ๋‹ˆ๊นŒ์š”! ๐Ÿ˜‰

๋จผ์ €, TDD๊ฐ€ ๋ญ”์ง€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. TDD๋Š” "Test-Driven Development"์˜ ์•ฝ์ž๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐœ๋ฐœ์„ ์ด๋Œ์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•๋ก ์ด์—์š”. ์Œ... ๋ญ”๊ฐ€ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”? ๋ณดํ†ต ๊ฐœ๋ฐœ์„ ๋จผ์ € ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€? ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ TDD๋Š” ์ด ์ˆœ์„œ๋ฅผ ๋’ค์ง‘์–ด ๋†“์€ ๊ฑฐ์ฃ ! ๐Ÿ˜ฒ

์ž, ์ด์ œ๋ถ€ํ„ฐ TDD์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์ถœ๋ฐœ~! ๐Ÿš—๐Ÿ’จ

๐Ÿค” TDD, ์™œ ํ•„์š”ํ•œ ๊ฑธ๊นŒ์š”?

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

ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๊ณ  ๋‚˜์„œ์•ผ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค๋ฉด? ๊ทธ๋•Œ ๊ฐ€์„œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋’ค์ง€๋ฉฐ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋ฉด? ์ƒ๊ฐ๋งŒ ํ•ด๋„ ์•„์ฐ”ํ•˜์ฃ ? ๐Ÿฅถ

๋ฐ”๋กœ ์ด๋Ÿฐ ์ด์œ  ๋•Œ๋ฌธ์— TDD๊ฐ€ ํ•„์š”ํ•œ ๊ฑฐ์˜ˆ์š”! TDD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด:

  • ๐ŸŽฏ ๋ฒ„๊ทธ๋ฅผ ์ดˆ๊ธฐ์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๐Ÿ”„ ๋ฆฌํŒฉํ† ๋ง์ด ์‰ฌ์›Œ์ ธ์š”. ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋‹ˆ ์•ˆ์‹ฌ!
  • ๐Ÿ“š ์ฝ”๋“œ๊ฐ€ ๊ณง ๋ฌธ์„œ๊ฐ€ ๋ผ์š”. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ฃ .
  • ๐Ÿง˜โ€โ™€๏ธ ๊ฐœ๋ฐœ์ž์˜ ์ŠคํŠธ๋ ˆ์Šค๊ฐ€ ์ค„์–ด๋“ค์–ด์š”. ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋‹ˆ ๋งˆ์Œ์ด ํŽธํ•ด์ง€์ฃ .

์™€~ ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ TDD ์ข‹์•„ ๋ณด์ด์ง€ ์•Š๋‚˜์š”? ๊ทผ๋ฐ ์ž ๊น, "๊ทธ๋ž˜๋„ ํ…Œ์ŠคํŠธ ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ข€ ์ด์ƒํ•ด์š”!"๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”. ๋งž์•„์š”, ์ฒ˜์Œ์—” ์ €๋„ ๊ทธ๋žฌ์–ด์š”. ใ…‹ใ…‹ใ…‹ ํ•˜์ง€๋งŒ ์ต์ˆ™ํ•ด์ง€๋ฉด ์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ธ์ง€ ๊นจ๋‹ซ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”!

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: TDD๋Š” ๊ฐœ๋ฐœ ์‹ค๋ ฅ์„ ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œ์‹œํ‚ค๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ์žฌ๋Šฅ๋„ท์—์„œ TDD ์ „๋ฌธ๊ฐ€์˜ ๊ฐ•์˜๋ฅผ ๋“ค์–ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— TDD๋ฅผ ์ ์šฉํ•ด๋ณด๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์‹ค๋ ฅ์ด ๋ˆˆ์— ๋„๊ฒŒ ํ–ฅ์ƒ๋  ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ TDD๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ์•Œ์•˜์œผ๋‹ˆ, ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฑด์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋‹ค์Œ ์„น์…˜์—์„œ TDD์˜ ๊ธฐ๋ณธ ์‚ฌ์ดํด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐Ÿ”„ TDD์˜ ๊ธฐ๋ณธ ์‚ฌ์ดํด: Red-Green-Refactor

์ž, ์ด์ œ TDD์˜ ํ•ต์‹ฌ์ธ "Red-Green-Refactor" ์‚ฌ์ดํด์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฒŒ ๋ญ๋ƒ๊ณ ์š”? ์Œ... ์‹ ํ˜ธ๋“ฑ์„ ๋– ์˜ฌ๋ ค๋ณด์„ธ์š”! ๐Ÿšฆ ๋นจ๊ฐ„๋ถˆ, ์ดˆ๋ก๋ถˆ, ๊ทธ๋ฆฌ๊ณ ... ์Œ, ๋ฆฌํŒฉํ† ๋ง๋ถˆ? ใ…‹ใ…‹ใ…‹ ๋†๋‹ด์ด์—์š”. ํ•˜์ง€๋งŒ ์ด ๋น„์œ ๊ฐ€ TDD ์‚ฌ์ดํด์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”.

TDD Red-Green-Refactor ์‚ฌ์ดํด Red Green Refactor TDD Cycle

1. Red: ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ ๐Ÿ”ด

TDD์˜ ์ฒซ ๋‹จ๊ณ„๋Š” ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. "์—ฅ? ์ผ๋ถ€๋Ÿฌ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ ์š”?" ๋งž์•„์š”, ์ด์ƒํ•˜๊ฒŒ ๋“ค๋ฆฌ์ฃ ? ใ…‹ใ…‹ใ…‹

ํ•˜์ง€๋งŒ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค๋ ค๋Š” ๊ธฐ๋Šฅ์ด ์•„์ง ์—†์ž–์•„์š”? ๊ทธ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋ฉด, ๋‹น์—ฐํžˆ ์‹คํŒจํ•  ์ˆ˜๋ฐ–์— ์—†์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ "Red" ๋‹จ๊ณ„์˜ˆ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋‚˜์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ์„ฑ์ธ์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด๋ด์š”. ๊ทธ๋Ÿผ ์ด๋Ÿฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ :


def test_is_adult():
    assert is_adult(20) == True
    assert is_adult(15) == False

์ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋‹น์—ฐํžˆ ์‹คํŒจํ•˜๊ฒ ์ฃ ! is_adult ํ•จ์ˆ˜๊ฐ€ ์•„์ง ์—†์œผ๋‹ˆ๊นŒ์š”. ๋ฐ”๋กœ ์ด๊ฒŒ "Red" ๋‹จ๊ณ„์˜ˆ์š”.

2. Green: ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ๐ŸŸข

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ์–ด์š”. ๋‹ค์Œ์€ ๋ญ˜ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋งž์•„์š”, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ด์š”! ์ด๊ฒŒ ๋ฐ”๋กœ "Green" ๋‹จ๊ณ„์˜ˆ์š”.

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

์šฐ๋ฆฌ์˜ ์˜ˆ์ œ๋กœ ๋Œ์•„๊ฐ€๋ณผ๊นŒ์š”? is_adult ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”:


def is_adult(age):
    return age >= 18

์งœ์ž”! ์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ํ†ต๊ณผํ•  ๊ฑฐ์˜ˆ์š”. ์ถ•ํ•˜ํ•ด์š”, ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉ๊ธˆ "Green" ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ–ˆ์–ด์š”! ๐ŸŽ‰

3. Refactor: ์ฝ”๋“œ ๊ฐœ์„ ํ•˜๊ธฐ ๐Ÿ”ต

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” "Refactor"์˜ˆ์š”. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด์š”. ๋” ํšจ์œจ์ ์œผ๋กœ, ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ, ๋” ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฑฐ์ฃ !

์šฐ๋ฆฌ์˜ is_adult ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ๊ฝค ๊ฐ„๋‹จํ•ด ๋ณด์ด๋„ค์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด ๋‹จ๊ณ„๊ฐ€ ์ •๋ง ์ค‘์š”ํ•ด์š”. ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก, ๋ฆฌํŒฉํ† ๋ง์˜ ์ค‘์š”์„ฑ์€ ๋” ์ปค์ง€๊ฑฐ๋“ ์š”.

๋ฆฌํŒฉํ† ๋ง์˜ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ๋งŒ์•ฝ ์šฐ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค๋ฉด:


def is_adult(age):
    if age >= 18:
        return True
    else:
        return False

์ด๋ ‡๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ :


def is_adult(age):
    return age >= 18

๋ณด์„ธ์š”, ๋” ๊ฐ„๊ฒฐํ•ด์กŒ์ฃ ? ์ด๊ฒŒ ๋ฐ”๋กœ ๋ฆฌํŒฉํ† ๋ง์ด์—์š”!

๐ŸŒŸ ์ค‘์š” ํฌ์ธํŠธ: ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ด์•ผ ํ•ด์š”. ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋‹ค๊ฐ€ ์‹ค์ˆ˜๋กœ ๊ธฐ๋Šฅ์„ ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜๋„ ์žˆ๊ฑฐ๋“ ์š”. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์šฐ๋ฆฌ์—๊ฒ ๋ฏฟ์Œ์งํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์žˆ์ž–์•„์š”! ๐Ÿ˜Ž

์ž, ์ด๋ ‡๊ฒŒ Red-Green-Refactor ์‚ฌ์ดํด์„ ํ•œ ๋ฒˆ ๋Œ์•˜์–ด์š”. ์ด์ œ ๋ญ˜ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋งž์•„์š”, ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ์˜ˆ์š”! ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด ์‚ฌ์ดํด์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฑฐ์ฃ .

์–ด๋•Œ์š”? TDD์˜ ๊ธฐ๋ณธ ์‚ฌ์ดํด, ์ดํ•ด๊ฐ€ ๋˜์…จ๋‚˜์š”? ์ฒ˜์Œ์—๋Š” ์ข€ ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. "์•„, ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋ผ๊ณ ? ๋ญ˜ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ?" ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค ์ˆ˜ ์žˆ์ฃ . ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์—ฐ์Šตํ•˜๋‹ค ๋ณด๋ฉด ์ ์  ์ต์ˆ™ํ•ด์งˆ ๊ฑฐ์˜ˆ์š”. ๊ทธ๋ฆฌ๊ณ  ์–ธ์  ๊ฐ€๋Š” "์•„, ํ…Œ์ŠคํŠธ ์—†์ด ์ฝ”๋”ฉํ•˜๋Š” ๊ฒŒ ๋” ์ด์ƒํ•ด!"๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿงฉ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ vs ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ: ์ฐจ์ด์ ๊ณผ ์ค‘์š”์„ฑ

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

1. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Unit Test) ๐Ÿ”ฌ

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๋ง ๊ทธ๋Œ€๋กœ '๋‹จ์œ„'๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ์—ฌ๊ธฐ์„œ '๋‹จ์œ„'๋ž€ ๋ณดํ†ต ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ, ๋˜๋Š” ์ž‘์€ ํด๋ž˜์Šค๋ฅผ ๋งํ•ด์š”. ์ฆ‰, ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋ถ€๋ถ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฑฐ์ฃ .

๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ํŠน์ง•:

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

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ ์•„๊นŒ ๋งŒ๋“  is_adult ํ•จ์ˆ˜์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š”:


def test_is_adult():
    assert is_adult(20) == True
    assert is_adult(15) == False
    assert is_adult(18) == True
    assert is_adult(0) == False

๋ณด์„ธ์š”, ์ด ํ…Œ์ŠคํŠธ๋Š” is_adult ํ•จ์ˆ˜๋งŒ์„ ์ง‘์ค‘์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์–ด์š”. ๋‹ค์–‘ํ•œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์ฃ .

2. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (Integration Test) ๐Ÿ”—

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ์—ฌ๋Ÿฌ ๋‹จ์œ„๊ฐ€ ํ•จ๊ป˜ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ์˜ˆ์š”. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ ๋ถ€ํ’ˆ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ๊ทธ ๋ถ€ํ’ˆ๋“ค์„ ์กฐ๋ฆฝํ•ด์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฑฐ์ฃ .

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์˜ ํŠน์ง•:

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

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž ๋“ฑ๋ก ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด์š”:


def test_user_registration():
    # ์‚ฌ์šฉ์ž ๋“ฑ๋ก
    user = register_user("alice@example.com", "password123")
    
    # ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž ์ •๋ณด ํ™•์ธ
    assert user.email == "alice@example.com"
    
    # ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ
    logged_in_user = login("alice@example.com", "password123")
    assert logged_in_user is not None
    
    # ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ ์‹œ๋„
    failed_login = login("alice@example.com", "wrongpassword")
    assert failed_login is None

์ด ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž ๋“ฑ๋ก, ๋กœ๊ทธ์ธ, ์ž˜๋ชป๋œ ๋กœ๊ทธ์ธ ์‹œ๋„ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์˜ˆ์š”!

๐Ÿค” ๊ทธ๋ž˜์„œ, ์–ด๋–ค ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ํ• ๊นŒ์š”?

์ •๋‹ต์€... ๋‘˜ ๋‹ค์˜ˆ์š”! ๐Ÿ˜‰

๐Ÿ’ก ๊ท ํ˜•์ด ์ค‘์š”ํ•ด์š”: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์žˆ์–ด์š”. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๋น ๋ฅด๊ณ  ๊ตฌ์ฒด์ ์ด์ง€๋งŒ, ์ „์ฒด ์‹œ์Šคํ…œ์˜ ๋™์ž‘์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์•„์š”. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ์ „์ฒด์ ์ธ ๋™์ž‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋ฌธ์ œ์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ฃ . ๊ทธ๋ž˜์„œ ๋‘˜ ๋‹ค ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”!

๋ณดํ†ต ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๋Ÿฐ ๋น„์œจ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์š”:

ํ…Œ์ŠคํŠธ ํ”ผ๋ผ๋ฏธ๋“œ UI ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

์ด๊ฑธ "ํ…Œ์ŠคํŠธ ํ”ผ๋ผ๋ฏธ๋“œ"๋ผ๊ณ  ๋ถˆ๋Ÿฌ์š”. ๋ฐ‘์—์„œ๋ถ€ํ„ฐ:

  • ๐Ÿ“Š ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์•„์š” (์•ฝ 70%)
  • ๐Ÿ”— ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ทธ ๋‹ค์Œ (์•ฝ 20%)
  • ๐Ÿ–ฅ๏ธ UI ํ…Œ์ŠคํŠธ ๋“ฑ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํ…Œ์ŠคํŠธ (์•ฝ 10%)

๋ฌผ๋ก  ์ด ๋น„์œจ์€ ์ ˆ๋Œ€์ ์ธ ๊ฑด ์•„๋‹ˆ์—์š”. ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์ฃ . ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”.

๐ŸŒŸ ์žฌ๋Šฅ๋„ท TIP: TDD๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์—ฐ์Šตํ•ด๋ณด๋Š” ๊ฒŒ ์ข‹์•„์š”. ์ž‘์€ ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ์ ์  ๋ฒ”์œ„๋ฅผ ๋„“ํ˜€๊ฐ€๋Š” ๊ฑฐ์ฃ . ์žฌ๋Šฅ๋„ท์—์„œ TDD ๊ด€๋ จ ๊ฐ•์˜๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ๊ท ํ˜• ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์˜ ์ฐจ์ด์ ๊ณผ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์–ด๋•Œ์š”, ์ดํ•ด๊ฐ€ ๋˜์…จ๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ์ฒ˜์Œ์—๋Š” ์ข€ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ํ•ด๋ณด๋ฉด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•„์š”. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ž˜ ์ž‘์„ฑํ•ด๋‘๋ฉด, ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์ •๋ง ํฐ ๋„์›€์ด ๋œ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ’ช

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ TDD๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํŒ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

๐Ÿ› ๏ธ TDD ์‹ค์ „ ์ ์šฉ: ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ์™€ ํŒ

์ž, ์ด์ œ TDD์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ํ…Œ์ŠคํŠธ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์œผ๋‹ˆ, ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„, ์ค€๋น„๋˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ ํ•จ๊ป˜ TDD์˜ ์„ธ๊ณ„๋กœ ๋›ฐ์–ด๋“ค์–ด๋ด์š”! ๐ŸŠโ€โ™‚๏ธ

1. ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ํ•˜๊ธฐ ๐Ÿ“

TDD๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ๋ฐ”๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋ฌด์—‡์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€, ์–ด๋–ค ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ์ง€ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ๊ธฐ ์•ฑ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”. ์š”๊ตฌ์‚ฌํ•ญ์€ ์ด๋ ‡๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด์š”:

  • โž• ๋ง์…ˆ ๊ธฐ๋Šฅ
  • โž– ๋บ„์…ˆ ๊ธฐ๋Šฅ
  • โœ–๏ธ ๊ณฑ์…ˆ ๊ธฐ๋Šฅ
  • โž— ๋‚˜๋ˆ—์…ˆ ๊ธฐ๋Šฅ
  • ๐Ÿ”ข ์†Œ์ˆ˜์  ๋‘ ์ž๋ฆฌ๊นŒ์ง€ ๊ณ„์‚ฐ

์ด๋ ‡๊ฒŒ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ํ•ด๋‘๋ฉด, ์–ด๋–ค ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ค๊ฒ ์ฃ ?

2. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑํ•˜๊ธฐ โœ๏ธ

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

์šฐ๋ฆฌ์˜ ๊ณ„์‚ฐ๊ธฐ ์•ฑ์„ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ช‡ ๊ฐœ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”?


def test_addition():
    assert calculate(2, 3, '+') == 5
    assert calculate(-1, 1, '+') == 0
    assert calculate(0.1, 0.2, '+') == 0.3

def test_division():
    assert calculate(6, 3, '/') == 2
    assert calculate(5, 2, '/') == 2.5
    with pytest.raises(ValueError):
        calculate(5, 0, '/')  # 0์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ์‹œ๋„

def test_invalid_operator():
    with pytest.raises(ValueError):
        calculate(5, 2, '%')  # ์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

๋ณด์„ธ์š”, ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ(2+3=5)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์Œ์ˆ˜๋‚˜ ์†Œ์ˆ˜์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์‹ฌ์ง€์–ด 0์œผ๋กœ ๋‚˜๋ˆ„๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ๊นŒ์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜๋ฉด ๋‚˜์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ์–ด์š”!

3. ํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•˜๊ณ  ์‹คํŒจ ํ™•์ธํ•˜๊ธฐ ๐Ÿ”ด

์ž, ์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๋‹น์—ฐํžˆ ์•„์ง ๊ตฌํ˜„์„ ์•ˆ ํ–ˆ์œผ๋‹ˆ๊นŒ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฑฐ์˜ˆ์š”. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ด๊ฒŒ ๋ฐ”๋กœ TDD์˜ ์ฒซ ๋‹จ๊ณ„, Red ๋‹จ๊ณ„์˜ˆ์š”!

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋Œ€๋žต ์ด๋Ÿฐ ์‹์ผ ๊ฑฐ์˜ˆ์š”:


============================= FAILURES ==============================
__________________________ test_addition ___________________________
AssertionError: assert None == 5
__________________________ test_division __________________________
AssertionError: assert None == 2
...

๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋„ค์š”. ํ•˜์ง€๋งŒ ์ด๊ฑด ์ข‹์€ ๊ฑฐ์˜ˆ์š”! ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ๐Ÿ˜Š

4. ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ๐ŸŸข

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

์šฐ๋ฆฌ์˜ ๊ณ„์‚ฐ๊ธฐ ์•ฑ์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”?


def calculate(a, b, operator):
    if operator == '+':
        return round(a + b, 2)
    elif operator == '-':
        return round(a - b, 2)
    elif operator == '*':
        return round(a * b, 2)
    elif operator == '/':
        if b == 0:
            raise ValueError("Cannot divide by zero")
        return round(a / b, 2)
    else:
        raise ValueError("Invalid operator")

์ด์ œ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•  ๊ฑฐ์˜ˆ์š”! ๐ŸŽ‰

5. ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ๐Ÿ”ต

๋งˆ์ง€๋ง‰์œผ๋กœ Refactor ๋‹จ๊ณ„์˜ˆ์š”. ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฑธ ํ™•์ธํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๋” ํšจ์œจ์ ์œผ๋กœ, ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”?

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ์˜ calculate ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”:


import operator

def calculate(a, b, op):
    operations = {
        '+': operator.add,
        '-': operator.sub,
        '*': operator.mul,
        '/': operator.truediv
    }
    
    if op not in operations:
        raise ValueError("Invalid operator")
    
    if op == '/' and b == 0:
        raise ValueError("Cannot divide by zero")
    
    return round(operations[op](a, b), 2)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ ธ์š”. ๋ฆฌํŒฉํ† ๋ง์„ ํ–ˆ์œผ๋‹ˆ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์•„๋ฌด๊ฒƒ๋„ ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ด์š”!

6. ๋ฐ˜๋ณตํ•˜๊ธฐ ๐Ÿ”„

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” TDD์˜ ํ•œ ์‚ฌ์ดํด์„ ์™„๋ฃŒํ–ˆ์–ด์š”. ์ด์ œ ๋ญ˜ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋งž์•„์š”, ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ์˜ˆ์š”! ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฑฐ์ฃ .

๐Ÿ’ก TDD ์‹ค์ „ ํŒ:

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

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

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ TDD ๋งˆ์Šคํ„ฐ๊ฐ€ ๋  ์ค€๋น„๊ฐ€ ๋์–ด์š”! ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ํ•œ๋ฒˆ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ํ™”์ดํŒ…! ๐Ÿ’ช

๐ŸŽญ TDD์˜ ์žฅ๋‹จ์ ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

์ž, ์ด์ œ TDD์— ๋Œ€ํ•ด ๊ฝค ๋งŽ์ด ์•Œ๊ฒŒ ๋˜์…จ์ฃ ? ๊ทผ๋ฐ ์ž ๊น, TDD๊ฐ€ ์ •๋ง ์™„๋ฒฝํ•œ ๋ฐฉ๋ฒ•์ผ๊นŒ์š”? ๋ชจ๋“  ์ƒํ™ฉ์—์„œ TDD๋ฅผ ์จ์•ผ ํ• ๊นŒ์š”? ์Œ... ๊ทธ๊ฑด ์•„๋‹ˆ์—์š”. TDD๋„ ์žฅ๋‹จ์ ์ด ์žˆ๊ณ , ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค์ด ์žˆ๋‹ต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿง

TDD์˜ ์žฅ์  ๐Ÿ‘

  • ๐Ÿ› ๋ฒ„๊ทธ ๊ฐ์†Œ: ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋‹ˆ๊นŒ ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ์–ด์š”.
  • ๐Ÿ—๏ธ ๋” ๋‚˜์€ ์„ค๊ณ„: ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•˜๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ข‹์€ ๊ตฌ์กฐ๊ฐ€ ๋‚˜์™€์š”.
  • ๐Ÿ”„ ๋ฆฌํŒฉํ† ๋ง ์šฉ์ด: ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ๋งˆ์Œ๊ป ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๐Ÿ“š ์‚ด์•„์žˆ๋Š” ๋ฌธ์„œ: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๊ณง ๋ช…์„ธ๊ฐ€ ๋˜์–ด ์ฝ”๋“œ์˜ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ์š”.
  • ๐Ÿ˜Œ ๊ฐœ๋ฐœ์ž ์ž์‹ ๊ฐ ์ƒ์Šน: ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ๋ฏฟ์„ ์ˆ˜ ์žˆ์–ด์š”.

TDD์˜ ๋‹จ์  ๐Ÿ‘Ž

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

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ:

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

์ž, ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ TDD๊ฐ€ ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์ฃ ? ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ TDD๋ฅผ ํฌ๊ธฐํ•  ํ•„์š”๋Š” ์—†์–ด์š”. ์ค‘์š”ํ•œ ๊ฑด ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.

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

๊ฒฐ๊ตญ, TDD๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๊ทธ๋ ‡๋“ฏ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ ํŠน์„ฑ, ํŒ€์˜ ์ƒํ™ฉ, ๊ฐœ๋ฐœ ์ผ์ • ๋“ฑ์„ ๊ณ ๋ คํ•ด์„œ TDD๋ฅผ ์ ์šฉํ• ์ง€, ์–ด๋Š ์ •๋„๋กœ ์ ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: TDD๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์ž‘์€ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋ถ„์—์„œ ์‹œ์ž‘ํ•ด๋ณด๋Š” ๊ฒŒ ์ข‹์•„์š”. ์ ์ง„์ ์œผ๋กœ TDD๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ํŒ€๊ณผ ํ•จ๊ป˜ ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€์„ธ์š”. ์žฌ๋Šฅ๋„ท์—์„œ TDD ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ๋ฉ˜ํ† ์™€ ์ƒ๋‹ด์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์–ด์š”!

์ž, ์ด์ œ TDD์˜ ์žฅ๋‹จ์ ๊ณผ ์ฃผ์˜์‚ฌํ•ญ๊นŒ์ง€ ์•Œ์•„๋ดค์–ด์š”. ์–ด๋– ์„ธ์š”? TDD์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋˜์…จ๋‚˜์š”? ๐Ÿค“

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

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ TDD ์—ฌํ–‰์ด ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ •๋ฆฌ์™€ ๊ฒฐ๋ก ์„ ๋‚ด๋ณด๋„๋ก ํ• ๊นŒ์š”? ๋‹ค์Œ ์„น์…˜์—์„œ ๋งŒ๋‚˜์š”! ๐Ÿš€

๐ŸŽฌ ๊ฒฐ๋ก : TDD, ๋‹น์‹ ์˜ ๊ฐœ๋ฐœ ์ธ์ƒ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ž, ๋“œ๋””์–ด ์šฐ๋ฆฌ์˜ TDD ์—ฌํ–‰์ด ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ๊ธด ์—ฌ์ •์ด์—ˆ์ฃ ? ํ•˜์ง€๋งŒ ์ •๋ง ๊ฐ’์ง„ ๊ฒฝํ—˜์ด์—ˆ์„ ๊ฑฐ์˜ˆ์š”. ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฑธ ์ •๋ฆฌํ•ด๋ณด๊ณ , TDD๊ฐ€ ๊ณผ์—ฐ ์šฐ๋ฆฌ์˜ ๊ฐœ๋ฐœ ์ธ์ƒ์„ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”? ๐Ÿค”

๐Ÿ”„ TDD ์—ฌํ–‰ ์ •๋ฆฌ

  1. TDD๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด์—์š”.
  2. Red-Green-Refactor ์‚ฌ์ดํด์„ ํ†ตํ•ด ์ ์ง„์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด๋‚˜๊ฐ€์š”.
  3. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ ์ ˆํžˆ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.
  4. TDD๋Š” ๋ฒ„๊ทธ ๊ฐ์†Œ, ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ, ๋ฆฌํŒฉํ† ๋ง ์šฉ์ด์„ฑ ๋“ฑ ๋งŽ์€ ์žฅ์ ์ด ์žˆ์–ด์š”.
  5. ํ•˜์ง€๋งŒ ํ•™์Šต ๊ณก์„ , ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜ ๋“ฑ์˜ ๋‹จ์ ๋„ ์žˆ์ฃ .
  6. ๋ชจ๋“  ์ƒํ™ฉ์— TDD๊ฐ€ ์ ํ•ฉํ•œ ๊ฑด ์•„๋‹ˆ์—์š”. ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์— ๋งž๊ฒŒ ์ ์šฉํ•ด์•ผ ํ•ด์š”.

๐Ÿค” TDD, ์ •๋ง๋กœ ์šฐ๋ฆฌ์˜ ๊ฐœ๋ฐœ ์ธ์ƒ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„๊นŒ์š”?

์Œ... ์ •๋‹ต์€ "๊ทธ๋Ÿด ์ˆ˜ ์žˆ๋‹ค"์˜ˆ์š”. ํ•˜์ง€๋งŒ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ํ•˜๋ฃจ์•„์นจ์— ๋ชจ๋“  ๊ฒŒ ๋ฐ”๋€Œ์ง„ ์•Š์„ ๊ฑฐ์˜ˆ์š”. TDD๋Š” ํ•˜๋‚˜์˜ ๋„๊ตฌ์ด์ž ๋ฐฉ๋ฒ•๋ก ์ผ ๋ฟ์ด์—์š”. ์ค‘์š”ํ•œ ๊ฑด ์—ฌ๋Ÿฌ๋ถ„์ด ์–ด๋–ป๊ฒŒ ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š๋ƒ์˜ˆ์š”.

TDD๋ฅผ ์ œ๋Œ€๋กœ ์‹ค์ฒœํ•œ๋‹ค๋ฉด:

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

ํ•˜์ง€๋งŒ TDD๊ฐ€ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์ง„ ์•Š์•„์š”. ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹ค๋ ฅ, ๊ฒฝํ—˜, ํŒ๋‹จ๋ ฅ์ด ์ค‘์š”ํ•ด์š”. TDD๋Š” ๊ทธ์ € ์—ฌ๋Ÿฌ๋ถ„์˜ ๋Šฅ๋ ฅ์„ ๊ทน๋Œ€ํ™”ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ผ ๋ฟ์ด์—์š”.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: TDD๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ธ๋‚ด์‹ฌ์ด ํ•„์š”ํ•ด์š”. ์ฒ˜์Œ์—๋Š” ์–ด์ƒ‰ํ•˜๊ณ  ์‹œ๊ฐ„๋„ ๋งŽ์ด ๊ฑธ๋ฆด ๊ฑฐ์˜ˆ์š”. ํ•˜์ง€๋งŒ ํฌ๊ธฐํ•˜์ง€ ๋งˆ์„ธ์š”! ์กฐ๊ธˆ์”ฉ ์—ฐ์Šตํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ TDD๊ฐ€ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์งˆ ๊ฑฐ์˜ˆ์š”. ์žฌ๋Šฅ๋„ท์—์„œ TDD ์ „๋ฌธ๊ฐ€์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ์ „๋ฌธ๊ฐ€์˜ ์กฐ์–ธ์„ ๋“ค์œผ๋ฉฐ TDD ์‹ค๋ ฅ์„ ํ‚ค์›Œ๋‚˜๊ฐ€์„ธ์š”!

๐ŸŒŸ ๋งˆ์ง€๋ง‰์œผ๋กœ...

TDD๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ์—์š”. ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ์ฒ ํ•™์ด์—์š”. ์ฝ”๋“œ์˜ ํ’ˆ์งˆ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์ฑ…์ž„๊ฐ์— ๋Œ€ํ•œ ์ฒ ํ•™์ด์ฃ .

TDD๋ฅผ ์‹ค์ฒœํ•œ๋‹ค๋Š” ๊ฑด, ์—ฌ๋Ÿฌ๋ถ„์ด ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค๋Š” ๋œป์ด์—์š”. ๋ฒ„๊ทธ๊ฐ€ ์ ๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ๋ณ€๊ฒฝ์ด ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค๋Š” ๊ฑฐ์ฃ . ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๋…ธ๋ ฅ์€ ๋ถ„๋ช… ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์ธ์ƒ์— ๊ธ์ •์ ์ธ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ๋‹ค์ค„ ๊ฑฐ์˜ˆ์š”.

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

์—ฌ๋Ÿฌ๋ถ„์˜ TDD ์—ฌ์ •์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค! ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„