๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋„์„œ ๋ฆฌ๋ทฐ/IT

์ž๋ฐ”์™€ JUnit์„ ํ™œ์šฉํ•œ ์‹ค์šฉ์ฃผ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฆฌ๋ทฐ

by ์ฃผ๋ฐœ2 2022. 4. 16.
๋ฐ˜์‘ํ˜•

๐Ÿ“Ž ์ž๋ฐ”์™€ JUnit์„ ํ™œ์šฉํ•œ ์‹ค์šฉ์ฃผ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฆฌ๋ทฐ

 

 

๐ŸŒˆ ๋„์„œ ๋ชฉ์ฐจ

๋„์„œ์˜ ์„ธ์„ธํ•œ ๋‚ด์šฉ์„ ์ œ์™ธํ•œ ์ฑ•ํ„ฐ ๋ฐ ๊ฐ ์žฅ์˜ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1๋ถ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๊ธฐ์ดˆ

  • 1์žฅ, ์ฒซ ๋ฒˆ์งธ JUnit ํ…Œ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
  • 2์žฅ, JUnit ์ง„์งœ๋กœ ์จ ๋ณด๊ธฐ
  • 3์žฅ, JUnit ๋‹จ์–ธ ๊นŠ๊ฒŒ ํŒŒ๊ธฐ
  • 4์žฅ, ํ…Œ์ŠคํŠธ ์กฐ์ง

2๋ถ€ ๋น ๋ฅธ ์•”๊ธฐ๋ฒ• ์Šต๋“

  • 5์žฅ, ์ข‹์€ ํ…Œ์ŠคํŠธ์˜ FIRST ์†์„ฑ
  • 6์žฅ, Right-BICEP: ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ธ๊ฐ€?
  • 7์žฅ, ๊ฒฝ๊ณ„ ์กฐ๊ฑด: CORRECT ๊ธฐ์–ต๋ฒ•

3๋ถ€ ๋” ํฐ ์„ค๊ณ„ ๊ทธ๋ฆผ

  • 8์žฅ, ๊น”๋”ํ•œ ์ฝ”๋“œ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ
  • 9์žฅ, ๋” ํฐ ์„ค๊ณ„ ๋ฌธ์ œ
  • 10์žฅ, ๋ชฉ ๊ฐ์ฒด ์‚ฌ์šฉ
  • 11์žฅ, ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง

4๋ถ€ ๋” ํฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ทธ๋ฆผ

  • 12์žฅ, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ
  • 13์žฅ, ๊นŒ๋‹ค๋กœ์šด ํ…Œ์ŠคํŠธ
  • 14์žฅ, ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ŠคํŠธ

 

 

๐ŸŒˆ ๋„์„œ Tips

์•„๋ž˜ ๋‚ด์šฉ๋“ค์€ ๋„์„œ์—์„œ ๊ฐ ์žฅ๋งˆ๋‹ค Tip์œผ๋กœ ์„ค๋ช…ํ•œ ๋ถ€๋ถ„๋“ค์— ๋Œ€ํ•ด ์ผ๋ถ€ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ „๋ถ€ ๋‹ค ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š์•˜์œผ๋‚˜ ๊ฐœ์ธ์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„ ๋„์›€์ด ๋˜์—ˆ๋˜ ๋ฌธ์žฅ๋“ค์ด๋ผ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  • ์ถ”ํ›„์— ํ…Œ์ŠคํŠธ๋ฅผ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์ •๋ฆฌํ•˜์„ธ์š”.(56p)
  • ์—ฌ๋Ÿฌ๋ถ„์ด ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”(95p)
  • ์ข‹์€ ํ…Œ์ŠคํŠธ์˜ ์กฐ๊ฑด: FIRST(100p)
  • ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ธ๊ฐ€? RIGHT-BICEP(120p)
  • ๋ชจ๋“  ์„ฑ๋Šฅ ์ตœ์ ํ™” ์‹œ๋„๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ ํ•ด์•ผ ํ•˜๋ฉฐ ์ถ”์ธก์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.(137p)
  • ๊น”๋”ํ•œ ์„ค๊ณ„๋Š” ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ตœ์„ ์˜ ์ค€๋น„์ž…๋‹ˆ๋‹ค.(179p)
  • ์‹œ์Šคํ…œ ์„ค๊ณ„ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋‚ฎ์•„์งˆ์ˆ˜๋ก ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ์œ ์ง€ ๋ณด์ˆ˜ ๋น„์šฉ์€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.(195p)
  • ์„ค๊ณ„๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€๋Š” ์ž์‹ ๊ฐ์„ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋†’์ด์„ธ์š”.(202p)
  • ๋ชฉ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€์˜ ๊ตฌ๋ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด ๊ตฌ๋ฉ์„ ๋ง‰์œผ์„ธ์š”.(222p)
  • ์ข‹์€ ํ…Œ์ŠคํŠธ๋Š” ๋…์ž๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํŒŒํ—ค์น˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.(240p)
  • TDD๋ฅผ ํ•  ๋•Œ ๊ฐ’๋น„์‹ธ๊ณ  ๋‚˜์œ ๊ฐ€์ •๋“ค์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ํ…Œ์ŠคํŠธ๊ฐ€ ๋จผ์ € ์‹คํŒจํ•˜๋Š”์ง€ ๊ด€์ฐฐํ•˜์„ธ์š”(252p)
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ํ•„์ˆ˜์ ์ด์ง€๋งŒ ์„ค๊ณ„ํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๊ฐœ์ˆ˜์™€ ๋ณต์žก๋„๋ฅผ ์ตœ์†Œํ™”ํ•˜์„ธ์š”.(293p)
  • CI ์„œ๋ฒ„๋Š” ํ˜„๋Œ€ ๊ฐœ๋ฐœ ํŒ€์„ ๊ตฌ์„ฑํ•˜๋Š” ์ตœ์†Œ ์š”๊ฑด์ž…๋‹ˆ๋‹ค.(307p)
  • ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ๋Š” ์ฝ”๋“œ๊ฐ€ ์–ด๋””์—์„œ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋ถ€์กฑํ•œ์ง€, ํŒ€์ด ์–ด๋””์—์„œ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.(312p)

 

 

๐ŸŒˆ ๋„์„œ ๋ฆฌ๋ทฐ

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

 

ํ•ด๋‹น ๋„์„œ๋Š” JUnit4 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ตœ์‹  ๋ฒ„์ „์ธ JUni5๊ณผ๋Š” ๋‹ค๋ฅธ ๋ฌธ๋ฒ•๋“ค์ด ๋ช‡๋ช‡ ์กด์žฌํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ์š”, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” JUnit5 ๋ฒ„์ „์œผ๋กœ ์ฑ…์ด ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉด ์–ด๋–จ๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด๊ธด ํ•ฉ๋‹ˆ๋‹ค.๐Ÿ˜‚

๋˜ํ•œ ์ €๋Š” ์ž‘๋…„ ์ดˆ์ฏค๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋˜์—ˆ๊ณ  ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, ๊ทธ๋ ‡๊ธฐ์— JUnit4 ๋ฒ„์ „์—์„œ ๊ฐ€์žฅ ์‹ ๊ธฐํ–ˆ๋˜ ์ ์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜๋Š” ๊ฐ๊ฐ JUnit4์™€ JUnit5์—์„œ @Test ์–ด๋…ธํ…Œ์ด์…˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

JUnit4์—๋Š” ์–ด๋…ธํ…Œ์ด์…˜์— expected()๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋…ธํ…Œ์ด์…˜์— ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JUnit4
Junit5

 

// JUnit4
@Test(expected=InsufficientFundsException.class)
public void throwsWhenWithdrawingTooMuch() {
    account.withdraw(100);
}


// JUnit5
@Test
void throwsWhenWithdrawingTooMuch() {
    assertThrows(InsufficientFundsException.class, () -> account.withdraw(100));
}

๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์œผ๋กœ๋Š” JUnit4 ๋ฒ„์ „์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‚˜?๋Š” ์ƒ๊ฐ์ด ๋“œ๋„ค์š”. ๐Ÿค”

 

์œ„ ๋‚ด์šฉ ์™ธ์—๋„ ์ข‹์€ ํ…Œ์ŠคํŠธ์˜ ์†์„ฑ์ธ FIRST, ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธ ํ• ์ง€์— ๋Œ€ํ•œ Right-BICEP ์ •์˜ ๋“ฑ์— ๋Œ€ํ•ด์„œ๋„ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด ๋‹ค์‹œ ํ•œ๋ฒˆ ์งš๊ณ ๊ฐ€๊ธฐ์— ์ข‹์€ ๋‹จ๋ฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

FIRST

  • Fast: ๋น ๋ฅธ
  • Isolated: ๊ณ ๋ฆฝ๋œ
  • Repeatable: ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ
  • Self-validationg: ์Šค์Šค๋กœ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ
  • Timely: ์ ์‹œ์˜

Right-BICEP

  • Right: ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ๊ฐ€?
  • B: ๊ฒฝ๊ณ„ ์กฐ๊ฑด์€ ๋งž๋Š”๊ฐ€?
  • I: ์—ญ ๊ด€๊ณ„๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • C: ๋‹ค๋ฅธ ์ˆ˜๋‹จ์„ ํ™œ์šฉํ•˜์—ฌ ๊ต์ฐจ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • E: ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ๊ฐ•์ œ๋กœ ์ผ์–ด๋‚˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • P: ์„ฑ๋Šฅ ์กฐ๊ฑด์€ ๊ธฐ์ค€์— ๋ถ€ํ•ฉํ•˜๋Š”๊ฐ€?

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

 

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ๋ชฉ(Mock) ์‚ฌ์šฉ๊ณผ TDD์— ๋Œ€ํ•œ ๊ฐœ๋… ์ •์˜ ๋ฐ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์˜ ๊นŒ๋‹ค๋กœ์šด ํ…Œ์ŠคํŠธ, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ํŒ€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ ๋“ฑ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”๋ฐ์š”, ํŒ€ ๋‹จ์œ„์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋ง‰ ๋„์ž…ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๋‹จ์›์ธ "14์žฅ, ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ŠคํŠธ"์˜ ๋‚ด์šฉ์€ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋™์•ˆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ๋„์„œ๋‚˜ ๊ฐ•์˜์—†์ด ์•ผํ–‰์„ฑ(?)์œผ๋กœ๋งŒ ํ•™์Šตํ•˜๊ณ  ์ ์šฉ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ์–ด๋Š์ •๋„ ์‚ฝ์งˆ์„ ํ†ตํ•ด ํ•™์Šต์„ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ๋„์„œ๋ฅผ ์ฝ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ์–ด๋• ์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค๊ธด ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ƒ

 

๋งˆ์ง€๋ง‰์œผ๋กœ ํฅ๋ฏธ๋กญ๊ฒŒ ๋ณด์•˜๋˜ ์˜์ƒ์„ ํ•˜๋‚˜ ํˆฌ์ฒ™ํ•˜๋ฉฐ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€