TDD

TDD๋ž€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„์ค‘ ๋‚ด๋ฆฐ ๊ฒฐ์ •๊ณผ ๊ทธ ๊ฒฐ์ •์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ธ์ง€ํ•˜๊ณ , ๋˜ํ•œ ์ด ๊ฐ„๊ฒฉ์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์„ ๋งํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋‹จ์ˆœํ•œ ๊ทœ์น™๋งŒ ๋”ฐ๋ฅธ๋‹ค.

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

  • ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์˜ ๊ฐ„๋žตํ•œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์žฌ๋นจ๋ฆฌ ํ…Œ์ŠคํŠธ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•œ๋‹ค.

  2. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  3. ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋ฐ”๊พผ๋‹ค.

  4. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ „๋ถ€ ์„ฑ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  5. ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด์„œ ์•„๋ž˜ ๋‚ด์šฉ๋“ค์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

  • ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ธฐ๋Šฅ์˜ ์ž‘์€ ์ฆ๊ฐ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ์ปค๋ฒ„ํ•˜๋Š”์ง€

  • ์ƒˆ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ์•„๊ฐ€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์–ผ๋งˆ๋‚˜ ์ž‘๊ณ  ๋ชป์ƒ๊ธด ๋ณ€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€

  • ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ง€

  • ์–ผ๋งˆ๋‚˜ ์ˆ˜ ์—†์ด ์ž‘์€ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ๋ฆฌํŒฉํ† ๋ง์ด ๋˜์–ด๊ฐ€๋Š”์ง€

์˜์กด์„ฑ๊ณผ ์ค‘๋ณต

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

์˜์กด์„ฑ์ด ๋ฌธ์ œ ๊ทธ ์ž์ฒด๋ผ๋ฉด, ์ค‘๋ณต์€ ๋ฌธ์ œ์˜ ์ง•ํ›„์ด๋‹ค. ์ค‘๋ณต์˜ ๊ฐ€์žฅ ํ”ํ•œ ์˜ˆ๋Š” ๋กœ์ง ์ค‘๋ณต์ด๋ฉฐ, ์ค‘๋ณต๋œ ๋กœ์ง์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š”๋ฐ๋Š” ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ์ผ ์ข‹๋‹ค.

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

์ผ๋ฐ˜์ ์ธ TDD ์ฃผ๊ธฐ

  1. ๋นจ๊ฐ• : ์‹คํŒจํ•˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ

    • ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ด๋•Œ ์˜ฌ๋ฐ”๋ฅธ ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผํ•œ๋‹ค.

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

    • ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ตœ๋Œ€ํ•œ ์ดˆ๋ก ๋ง‰๋Œ€(ํ…Œ์ŠคํŠธ ํ†ต๊ณผ)๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

    • ์ ‘๊ทผ๋ฒ•

      1. ๊ฐ€์งœ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ : ์ƒ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ง„์งœ ์ฝ”๋“œ๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ ๋‹จ๊ณ„์ ์œผ๋กœ ์ƒ์ˆ˜๋ฅผ ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พผ๋‹ค.

      2. ์‚ผ๊ฐ์ธก๋Ÿ‰๋ฒ•(5 == 5, 5 != 6) : ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅผ ๋•Œ ์ž‘์„ฑ

      3. ๋ช…๋ฐฑํ•œ ๊ตฌํ˜„ ์‚ฌ์šฉํ•˜๊ธฐ : ์‹ค์ œ ๊ตฌํ˜„์„ ์ž…๋ ฅํ•œ๋‹ค.

  3. ๋ฆฌํŒฉํ† ๋ง : ์ผ๋‹จ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ฒŒ๋งŒ ํ•˜๋Š” ์™€์ค‘์— ์ƒ๊ฒจ๋‚œ ๋ชจ๋“  ์ค‘๋ณต ์ œ๊ฑฐ

    • ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋•Œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด ๋ง‰ ๊ฐœ๋ฐœํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

3A ํŒจํ„ด

ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์‹œ ๊ณตํ†ต๋œ ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ๋‹ค.

  1. ์ค€๋น„(arrange) : ๊ฐ์ฒด ์ƒ์„ฑ

  2. ํ–‰๋™(act) : ์–ด๋–ค ์ž๊ทน์„ ์ค€๋‹ค.

  3. ํ™•์ธ(assert) : ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

ํ–‰๋™๊ณผ ํ™•์ธ ๋‹จ๊ณ„๋Š” ๋งค๋ฒˆ ๋‹ค๋ฅด์ง€๋งŒ ์ค€๋น„ ๋‹จ๊ณ„๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ƒ์„ฑํ•ด์•ผ๋ ๊นŒ?

์ด๋•Œ ๋‘๊ฐ€์ง€ ์ œ์•ฝ์ด ์ƒ์ถฉํ•œ๋‹ค.

  • ์„ฑ๋Šฅ : ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์—์„œ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ฐ์ฒด ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

  • ๊ฒฉ๋ฆฌ : ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์—์„œ ์„ฑ๊ณต/์‹คํŒจ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ƒํƒœ์—์„œ๋Š” ํ•œ๊ฐœ์˜ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ํ™•๋ฅ ์ด ๋†’๋‹ค.

ํ…Œ์ŠคํŠธ ์‚ฌ์ด์˜ ์ปคํ”Œ๋ง์€ ํ™•์‹คํžˆ ์ง€์ €๋ถ„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๋ฉฐ, ํ•œ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์ปคํ”Œ๋ง์€ ๋งŒ๋“ค๋ฉด ์•ˆ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹œ์Šคํ…œ์ด ์‘์ง‘๋„๋Š” ๋†’๊ณ  ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์€ ๊ฐ์ฒด์˜ ๋ชจ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.

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

ํ…Œ์ŠคํŠธ ์šฐ์„ 

  • ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธ๋ชฉ๋ก์„ ๋ชจ๋‘ ์ž‘์„ฑํ•œ ๋’ค ๊ตฌํ˜„ํ•˜์ž.

    1. ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์˜คํผ๋ ˆ์ด์…˜์˜ ์‚ฌ์šฉ ์˜ˆ๋ฅผ ์ž‘์„ฑ

    2. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์˜คํผ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” null๋ฒ„์ „์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€

    3. ๋ฆฌํŒฉํ† ๋ง ๋ชฉ๋ก์ถ”๊ฐ€

  • ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ง์ „์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋‹จ์–ธ(Assert) ์šฐ์„ 

ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์‹œ ๋‹จ์–ธ์„ ์ œ์ผ ๋จผ์ € ์“ฐ๊ณ  ์‹œ์ž‘ํ•˜์ž.

  1. ์™„๋ฃŒ๋œ ์‹œ์Šคํ…œ์ด ์–ด๋–จ์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ๋ถ€ํ„ฐ ์ž‘์„ฑ

  2. ๊ธฐ๋Šฅ์ด ์™„๋ฃŒ๋˜๋ฉด ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๋ถ€ํ„ฐ ์ž‘์„ฑ

  3. ์™„๋ฃŒ๋  ๋•Œ ํ†ต๊ณผํ•ด์•ผ ํ•  ๋‹จ์–ธ๋ถ€ํ„ฐ ์ž‘์„ฑ

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ฝ์„ ๋•Œ ์‰ฝ๊ณ  ๋”ฐ๋ผ๊ฐ€๊ธฐ ์ข‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์‹ค์ œ ์‹คํ–‰์„ ํ†ตํ•ด ์™ธ๋ถ€ ์ด๋ฒคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์„ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒฝ์šฐ

  • ์ด์ „ ์‹œ์Šคํ…œ์˜ ์ถœ๋ ฅ๊ณผ ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ์ถœ๋ ฅ์„ ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ (๋ณ‘๋ ฌ)

  • ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ์„ ๋ฆฌํŒฉํ† ๋งํ•œ ํ›„ ๊ธฐ์กด๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ

์œ„์˜ ๊ฒฝ์šฐ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค.

๋ช…๋ฐฑํ•œ ๋ฐ์ดํ„ฐ

ํ…Œ์ŠคํŠธ์˜ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ…Œ์ŠคํŠธ ์ž์ฒด์— ์˜ˆ์ƒ๋˜๋Š” ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์„ ํฌํ•จํ•˜๊ณ , ๋‘˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผํ•œ๋‹ค.

๋‹ค๋ฅธ ํ†ตํ™”๋กœ ํ™˜์ „ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ 1.5%๊ฐ€ ๋ถ™๋Š”๋‹ค. USD์—์„œ GBP๋กœ ๊ตํ™˜ํ•˜๋Š” ํ™˜์œจ์ด 2:1์ด๋ผ๋ฉด $100๋‹ฌ๋Ÿฌ๋ฅผ ํ™˜์ „ํ•˜๋ ค๋ฉด 50GBP - 1.5% = 49.25GBP์—ฌ์•ผํ•œ๋‹ค.

Bank bank = new Bank();
bank.addRate("USD", "GBP", STANDARD_RATE);
bank.commission(STANDARD_COMMISSION);
Money result = bank.convert(new Note(100, "USD"), "GBP");
assertEquals(new Note(49.25, "GBP"), result);

๊ณ„์‚ฐ์„ ๋” ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์œ„์˜ ์˜ˆ์ œ ๋ณด๋‹ค๋„ ๊ณ„์‚ฐ์„ ๋” ๋ช…ํ™•ํžˆ ๊ธฐ์ž…ํ•˜๋ฉด ํ…Œ์ŠคํŠธ์—์„œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋œ ์ˆซ์ž์™€ ๊ฒฐ๊ณผ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ฝ์–ด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ์œผ๋กœ ํ•  ์ผ์„ ๋” ์‰ฝ๊ฒŒ ์•Œ ใ…… ใ…œ์žˆ๋‹ค.

Bank bank = new Bank();
bank.addRate("USD", "GBP", 2);
bank.commission(0.015);
Money result = bank.convert(new Note(100, "USD"), "GBP");
assertEquals(new Note(100/2*(1-0.015), "GBP"), result);

์•„๋Š” ๊ฒƒ์—์„œ ๋ชจ๋ฅด๋Š” ๊ฒƒ์œผ๋กœ

์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ๋ชฉ๋ก ์ค‘์—์„œ ์•„๋Š” ๊ฒƒ๋ถ€ํ„ฐ ๋ชจ๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ญ˜ ๊ตฌํ˜„ํ•ด์•ผ๋ ์ง€ ์•Œ๋ฉด, ๋ช…๋ฐฑํ•œ ๊ตฌํ˜„์„ ํ•˜๊ณ , ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๊ฐ€์งœ ๊ตฌํ˜„์„ ํ•˜๋ฉด ๋œ๋‹ค.

๋ชจ์˜ ๊ฐ์ฒด

๋ชจ์˜ ๊ฐ์ฒด(Mock Object)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ์‹œ ์‹ค์ œ ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ ํšจ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๋ชจ์˜ ๊ฐ์ฒด(Mock Object)๋ž€ ์ฃผ๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธ ํ•  ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋ชจ๋“ˆ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋‚˜ ๋ชจ๋“ˆ๋“ค์„ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ์˜ ๋ชจ๋“ˆ์„ "ํ‰๋‚ด"๋‚ด๋Š” "๊ฐ€์งœ" ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ์˜ ํšจ์šฉ์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

์œ„ํ‚ค ๋ฐฑ๊ณผ-๋ชจ์˜ ๊ฐ์ฒด

๋ชจ์˜ ๊ฐ์ฒด๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ฐ€์‹œ์„ฑ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•˜๋„๋ก ๋งŒ๋“ค์–ด, ์„ค๊ณ„์—์„œ ์ปคํ”Œ๋ง์ด ๊ฐ์†Œํ•˜๋„๋ก ํ•œ๋‹ค.

Code Coverage

์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€(Code Coverage)๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋…ผํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์ถฉ๋ถ„ํ•œ๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ค‘ ํ•˜๋‚˜๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ปค๋ฒ„๋˜์—ˆ๋Š”๊ฐ€์ด๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‹คํ–‰๋˜์—ˆ๋ƒ๋Š” ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๋Š” ๊ฒƒ์€ ํฌ๊ฒŒ ๊ตฌ๋ฌธ(Statement), ์กฐ๊ฑด(Condition), ๊ฒฐ์ •(Decision)์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ปค๋ฒ„ํ–ˆ๋Š๋ƒ์— ๋”ฐ๋ผ ์ฝ”๋“œ์ปค๋ฒ„๋ฆฌ์ง€์˜ ์ธก์ •๊ธฐ์ค€์€ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๊ตฌ๋ฌธ(Statement)์ปค๋ฒ„๋ฆฌ์ง€์ด๋ฉฐ, ์‹คํ–‰ ์ฝ”๋“œ๋ผ์ธ์ด ํ•œ๋ฒˆ ์ด์ƒ ์‹คํ–‰ ๋˜๋ฉด ์ถฉ์กฑ๋œ๋‹ค. ์กฐ๊ฑด(Condition)์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๊ฐ ๋‚ด๋ถ€ ์กฐ๊ฑด์ด ์ฐธ ํ˜น์€ ๊ฑฐ์ง“์„ ๊ฐ€์ง€๋ฉด ์ถฉ์กฑ๋œ๋‹ค. ๊ฒฐ์ •(Decision) ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๊ฐ ๋ถ„๊ธฐ์˜ ๋‚ด๋ถ€ ์กฐ๊ฑด์ž์ฒด๊ฐ€ ์•„๋‹Œ ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ์ „์ฒด ๊ฒฐ๊ณผ๊ฐ€ ์ฐธ ํ˜น์€ ๊ฑฐ์ง“์ด๋ฉด ์ถฉ์กฑ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์กฐ๊ฑด๊ณผ ๊ฒฐ์ •์„ ๋ณตํ•ฉ์ ์œผ๋กœ ๊ณ ๋ คํ•˜๋Š” MC/DC ์ปค๋ฒ„๋ฆฌ์ง€ ๋˜ํ•œ ์žˆ๋‹ค. - ์œ„ํ‚ค๋ฐฑ๊ณผ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€

์ธก์ • ๊ธฐ์ค€

์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ™”์ดํŠธ ๋ฐ•์Šค ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ธก์ •ํ•œ๋‹ค.

ํ™”์ดํŠธ ๋ฐ•์Šค ํ…Œ์ŠคํŠธ(White-box test)

  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹

  • ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด๋ถ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ธฐ๋ฒ•

  • ๊ฐœ๋ฐœ์ž ๊ด€์ ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

๊ตฌ๋ฌธ(Statement)

๊ตฌ๋ฌธ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋ผ์ธ(Line) ์ปค๋ฒ„๋ฆฌ์ง€๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋ฉฐ, ์ฝ”๋“œ ํ•œ ์ค„์ด ํ•œ ๋ฒˆ ์ด์ƒ ์‹คํ–‰๋˜๋ฉด ์ถฉ์กฑํ•œ๋‹ค.

    void statement(int x) {
        System.out.println("start line"); // (1)
        if (x > 0) { // (2)
            System.out.println("middle line"); // (3)
        }
        System.out.println("last line"); // (4)
    }

์—ฌ๊ธฐ์„œ x = -1 ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด (3)์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด 4๊ฐœ์˜ ๋ผ์ธ ์ค‘ 1, 2, 4๋งŒ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ 75%๊ฐ€ ๋œ๋‹ค.

๊ตฌ๋ฌธ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

์กฐ๊ฑด(Condition)

๋ชจ๋“  ์กฐ๊ฑด์‹์˜ ๋‚ด๋ถ€ ์กฐ๊ฑด์ด true/false๋ฅผ ๊ฐ€์ง€๋ฉด ์ถฉ์กฑํ•œ๋‹ค.

	void condition(int x, int y) {
        System.out.println("start line"); // (1)
        if (x > 0 && y < 0) { // (2)
            System.out.println("middle line"); // (3)
        }
        System.out.println("last line"); // (4)
    }

์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” x = 1, y = 1, x = -1, y = -1 ์ด ์žˆ๋‹ค.

  • x > 0 ์กฐ๊ฑด : true/false

  • y < 0 ์กฐ๊ฑด : false/true

์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋งŒ์กฑํ•˜์ง€๋งŒ if๋ฌธ ์กฐ๊ฑด์€ ํ•ญ์ƒ false์ด๋ฏ€๋กœ (3) ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ŠคํŠธํ•œ ๊ฒฝ์šฐ, ๊ตฌ๋ฌธ ์ปค๋ฒ„๋ฆฌ์ง€์™€ ๊ฒฐ์ • ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ์ •(Decision)

๊ฒฐ์ • ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋ธŒ๋žœ์น˜(Branch) ์ปค๋ฒ„๋ฆฌ์ง€๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ๋ชจ๋“  ์กฐ๊ฑด์‹์ด true/false๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉด ์ถฉ์กฑํ•œ๋‹ค.

	void condition(int x, int y) {
        System.out.println("start line"); // (1)
        if (x > 0 && y < 0) { // (2)
            System.out.println("middle line"); // (3)
        }
        System.out.println("last line"); // (4)
    }

๊ฒฐ์ • ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” x = 1, y = -1, x = -1, y = 1 ์ด ์žˆ๋‹ค.

  • x > 0, y < 0 ๋ชจ๋‘ ๋งŒ์กฑ : true

  • x > 0, y < 0 ๋ถˆ์ถฉ์กฑ : false

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

์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ์™€ ์†Œ๋‚˜ํ๋ธŒ(SonarQube) ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๊ธฐ์กด๋ณด๋‹ค ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์ปค๋ฐ‹์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

์ฐธ๊ณ 

Last updated