Skip to content

kinowk/practical-testing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

49 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์š”๊ตฌ์‚ฌํ•ญ

  • ์ฃผ๋ฌธ ๋ชฉ๋ก์— ์Œ๋ฃŒ ์ถ”๊ฐ€/์‚ญ์ œ ๊ธฐ๋Šฅ
  • ์ฃผ๋ฌธ ๋ชฉ๋ก ์ „์ฒด ์ง€์šฐ๊ธฐ
  • ์ฃผ๋ฌธ ๋ชฉ๋ก ์ด ๊ธˆ์•ก ๊ณ„์‚ฐํ•˜๊ธฐ
  • ์ฃผ๋ฌธ ์ƒ์„ฑํ•˜๊ธฐ
  • ํ•œ ์ข…๋ฅ˜์˜ ์Œ๋ฃŒ ์—ฌ๋Ÿฌ ์ž”์„ ํ•œ ๋ฒˆ์— ๋‹ด๋Š” ๊ธฐ๋Šฅ
  • ๊ฐ€๊ฒŒ ์šด์˜ ์‹œ๊ฐ„(10:00 ~ 22:00) ์™ธ์—๋Š” ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ‚ค์˜ค์Šคํฌ ์ฃผ๋ฌธ์„ ์œ„ํ•œ ์ƒํ’ˆ ํ›„๋ณด ๋ฆฌ์ŠคํŠธ ์กฐํšŒํ•˜๊ธฐ
  • ์ƒํ’ˆ์˜ ํŒ๋งค ์ƒํƒœ: ํŒ๋งค์ค‘, ํŒ๋งค๋ณด๋ฅ˜, ํŒ๋งค์ค‘์ง€
    • ํŒ๋งค์ค‘, ํŒ๋งค๋ณด๋ฅ˜์ธ ์ƒํƒœ์˜ ์ƒํ’ˆ์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค.
  • ID, ์ƒํ’ˆ๋ฒˆํ˜ธ, ์ƒํ’ˆํƒ€์ž…, ํŒ๋งค์ƒํƒœ, ์ƒํ’ˆ์ด๋ฆ„, ๊ฐ€๊ฒฉ
  • ์ƒํ’ˆ ๋ฒˆํ˜ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„ ์ฃผ๋ฌธ ์ƒ์„ฑํ•˜๊ธฐ
  • ์ฃผ๋ฌธ์€ ์ฃผ๋ฌธ ์ƒํƒœ, ์ฃผ๋ฌธ ๋“ฑ๋ก ์‹œ๊ฐ„์„ ๊ฐ€์ง„๋‹ค.
  • ์ฃผ๋ฌธ์˜ ์ด ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ฃผ๋ฌธ ์ƒ์„ฑ ์‹œ ์žฌ๊ณ  ํ™•์ธ ๋ฐ ๊ฐœ์ˆ˜ ์ฐจ๊ฐ ํ›„ ์ƒ์„ฑํ•˜๊ธฐ
  • ์žฌ๊ณ ๋Š” ์ƒํ’ˆ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์žฌ๊ณ ์™€ ๊ด€๋ จ ์žˆ๋Š” ์ƒํ’ˆ ํƒ€์ž…์€ ๋ณ‘ ์Œ๋ฃŒ, ๋ฒ ์ด์ปค๋ฆฌ์ด๋‹ค.
  • ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ์‹ ๊ทœ ์ƒํ’ˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒํ’ˆ๋ช…, ์ƒํ’ˆ ํƒ€์ž…, ํŒ๋งค ์ƒํƒœ, ๊ฐ€๊ฒฉ ๋“ฑ์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

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

  • ์ž‘์€ ์ฝ”๋“œ ๋‹จ์œ„(ํด๋ž˜์Šค or ๋ฉ”์„œ๋“œ)๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ
  • ๊ฒ€์ฆ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์•ˆ์ •์ ์ด๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์„ธ๋ถ„ํ™”ํ•˜๊ธฐ

  • ํ•ดํ”ผ์ผ€์ด์Šค
  • ์˜ˆ์™ธ์ผ€์ด์Šค
    • ๊ฒฝ๊ณ„๊ฐ’ ํ…Œ์ŠคํŠธ (๋ฒ”์œ„(์ด์ƒ, ์ดํ•˜, ์ดˆ๊ณผ, ๋ฏธ๋งŒ), ๊ตฌ๊ฐ„, ๋‚ ์งœ ๋“ฑ)

ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๊ธฐ

์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ• ์ˆ˜๋ก ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” ๋งŽ์•„์ง„๋‹ค.

ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ์˜์—ญ

  1. ๊ด€์ธกํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ (IN)
    • ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„
    • ๋žœ๋ค ๊ฐ’
    • ์ „์—ญ ๋ณ€์ˆ˜/ํ•จ์ˆ˜
    • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ
  2. ์™ธ๋ถ€ ์„ธ๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ (OUT)
    • ํ‘œ์ค€ ์ถœ๋ ฅ
    • ๋ฉ”์‹œ์ง€ ๋ฐœ์†ก
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•˜๊ธฐ

ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์‰ฌ์šด ํ•จ์ˆ˜(์ˆœ์ˆ˜ํ•จ์ˆ˜)

  1. ๊ฐ™์€ ์ž…๋ ฅ์—๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ
  2. ์™ธ๋ถ€ ์„ธ์ƒ๊ณผ ๋‹จ์ ˆ๋œ ํ˜•ํƒœ
  3. ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ

TDD(Test Driven Development)

ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ตฌํ˜„ ๊ณผ์ •์„ ์ฃผ๋„ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก 

RED โ†’ GREEN โ†’ REFACTOR

RED: ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
GREEN: ํ…Œ์ŠคํŠธ ํ†ต๊ณผ / ์ตœ์†Œํ•œ์˜ ์ฝ”๋”ฉ
REFACTOR: ๊ตฌํ˜„ ์ฝ”๋“œ ๊ฐœ์„  / ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์œ ์ง€

์„  ๊ธฐ๋Šฅ ๊ตฌํ˜„, ํ›„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

  • ํ…Œ์ŠคํŠธ ์ž์ฒด์˜ ๋ˆ„๋ฝ ๊ฐ€๋Šฅ์„ฑ
  • ํŠน์ • ํ…Œ์ŠคํŠธ ์ผ€์ด(ํ•ดํ”ผ์ผ€์ด์Šค)๋งŒ ๊ฒ€์ฆํ•  ๊ฐ€๋Šฅ์„ฑ
  • ์ž˜๋ชป๋œ ๊ตฌํ˜„์„ ๋‹ค์†Œ ๋Šฆ๊ฒŒ ๋ฐœ๊ฒฌํ•  ๊ฐ€๋Šฅ์„ฑ

์„  ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, ํ›„ ๊ธฐ๋Šฅ ๊ตฌํ˜„

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

TDD: ๊ด€์ ์˜ ๋ณ€ํ™”
ํ…Œ์ŠคํŠธ๋Š” ๊ตฌํ˜„๋ถ€ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋ณด์กฐ์ˆ˜๋‹จ โ†’ ํ…Œ์ŠคํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ๋ฐœ์ „ํ•˜๋Š” ๊ตฌํ˜„๋ถ€

ํด๋ผ์ด์–ธํŠธ ๊ด€์ ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๋Š” Test Driven


ํ…Œ์ŠคํŠธ๋Š” ๋ฌธ์„œ๋‹ค

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

DisplayName์€ ์„ฌ์„ธํ•˜๊ฒŒ

  • ๋ช…์‚ฌ์˜ ๋‚˜์—ด๋ณด๋‹ค ๋ฌธ์žฅ์œผ๋กœ
    • ์Œ๋ฃŒ 1๊ฐœ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ โ†’ ์Œ๋ฃŒ๋ฅผ 1๊ฐœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ํ–‰์œ„์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊นŒ์ง€ ๊ธฐ์ˆ ํ•˜๊ธฐ
    • ์Œ๋ฃŒ๋ฅผ 1๊ฐœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ ์Œ๋ฃŒ๋ฅผ 1๊ฐœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ฃผ๋ฌธ ๋ชฉ๋ก์— ๋‹ด๊ธด๋‹ค.
  • ๋„๋ฉ”์ธ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ์ธต ์ถ”์ƒํ™”๋œ ๋‚ด์šฉ์„ ๋‹ด๊ธฐ(๋ฉ”์„œ๋“œ ์ž์ฒด์˜ ๊ด€์ ๋ณด๋‹ค ๋„๋ฉ”์ธ ์ •์ฑ… ๊ด€์ ์œผ๋กœ)
    • ํŠน์ • ์‹œ๊ฐ„ ์ด์ „์— ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•˜๋ฉด ์‹คํŒจํ•œ๋‹ค โ†’ ์˜์—… ์‹œ์ž‘ ์‹œ๊ฐ„ ์ด์ „์—๋Š” ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ…Œ์ŠคํŠธ์˜ ํ˜„์ƒ์„ ์ค‘์ ์œผ๋กœ ๊ธฐ์ˆ ํ•˜์ง€ ๋ง ๊ฒƒ
    • ์„ฑ๊ณตํ•œ๋‹ค/์‹คํŒจํ•œ๋‹ค โ†’ ๋‹ด๊ธด๋‹ค/์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค

BDD: Behavior Driven Development

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

Given/When/Then

  • Given: ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ค€๋น„ ๊ณผ์ • (๊ฐ์ฒด, ๊ฐ’, ์ƒํƒœ ๋“ฑ)
  • When: ์‹œ๋‚˜๋ฆฌ์˜ค ํ–‰๋™ ์ง„ํ–‰
  • Then: ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„ํ–‰์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๋ช…์‹œ, ๊ฒ€์ฆ

Spring & JPA ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ

๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜(Layered Architecture)

  • Persistence Layer
    • Data Access ์—ญํ• 
    • ๋น„์ง€๋‹ˆ์Šค ๊ฐ€๊ณต ๋กœ์ง์ด ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
    • Data์— ๋Œ€ํ•œ CRUD์—๋งŒ ์ง‘์ค‘ํ•œ ๋ ˆ์ด์–ด
  • Business Layer
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ์—ญํ• 
    • Persistence Layer์™€ ์ƒํ˜ธ์ž‘์šฉ(Data๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ํ–‰์œ„)์„ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ „๊ฐœ์‹œํ‚จ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.
  • Presentation Layer
    • ์™ธ๋ถ€ ์„ธ๊ณ„์˜ ์š”์ฒญ์„ ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›๋Š” ๊ณ„์ธต
    • ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

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

  • ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ํ˜‘๋ฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์€ ๋ฒ”์œ„์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๊ธฐ๋Šฅ ์ „์ฒด์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ’๋ถ€ํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ & ํฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ†ตํ•ฉํ…Œ์ŠคํŠธ

MockMvc

  • Mock(๊ฐ€์งœ) ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํ”„๋ง MVC ๋™์ž‘์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

Keyword

  • Layerd Architecture
  • Hexagonal Architecture
  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ vs ํ†ตํ•ฉํ…Œ์ŠคํŠธ
  • IoC, DI, AOP
  • ORM, ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜, Hibernate
  • Spring Data JPA
  • QueryDSL
  • @SpringBootTest vs @DataJpaTest
  • @SpringBootTest vs @WebMvcTest
  • Optimistic Lock, Pessimistic Lock
  • CQRS
  • @RestControllerAdvice, @ExceptionHandler
  • Spring Bean Validation
    • @NotNull, @NotEmpty, @NotBlank, ...
  • Mock, Mockito, @MockBean

About

๐Ÿ“ ์‹ค์šฉ์ ์ธ ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages