Skip to content

Latest commit

Β 

History

History
82 lines (58 loc) Β· 5.14 KB

unit-test-guide.md

File metadata and controls

82 lines (58 loc) Β· 5.14 KB

쒋은 λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ 원칙

  • λŒ€λΆ€λΆ„μ˜ μ½”λ“œλŠ” κ²©λ¦¬λ˜μ–΄ μžˆμ§€ μ•Šκ³ , λ‹€λ₯Έ μˆ˜λ§Žμ€ μ½”λ“œμ— μ˜μ‘΄ν•œλ‹€.
  • μ–΄λ–€ κ°œλ°œμžλ“€μ€ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ—μ„œ ν…ŒμŠ€νŠΈ λŒ€μƒμ΄ λ˜λŠ” μ½”λ“œκ°€ μ˜μ‘΄ν•˜λŠ” μ½”λ“œλ₯Ό μ°¨λ‹¨ν•˜λ €κ³ λ„ ν•˜λŠ” 반면, λ‹€λ₯Έ κ°œλ°œμžλ“€μ€ μ˜μ‘΄ν•˜λŠ” μ½”λ“œλ₯Ό ν¬ν•¨ν•΄μ„œ ν…ŒμŠ€νŠΈν•˜λŠ” 것을 μ„ ν˜Έν•œλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈ 기초

  • ν…ŒμŠ€νŠΈ 쀑인 μ½”λ“œ
    • μ‹€μ œ μ½”λ“œλΌκ³ λ„ ν•˜κ³ , ν…ŒμŠ€νŠΈμ˜ λŒ€μƒμ΄ λ˜λŠ” μ½”λ“œλ₯Ό μ˜λ―Έν•œλ‹€.
  • ν…ŒμŠ€νŠΈ μ½”λ“œ
    • λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” μ½”λ“œλ₯Ό 가리킨닀.
  • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€
    • νŠΉμ • λ™μž‘μ΄λ‚˜ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€.
    • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ•„λž˜μ™€ 같은 μ„Ήμ…˜μœΌλ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€.
    1. μ€€λΉ„ (given) : ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ νŠΉμ • λ™μž‘μ„ ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ λͺ‡κ°€μ§€ 섀정을 μˆ˜ν–‰ν•˜λŠ” 것
    2. μ‹€ν–‰ (when) : ν…ŒμŠ€νŠΈ 쀑인 λ™μž‘μ„ μ‹€μ œλ‘œ ν˜ΈμΆœν•˜λŠ” μ½”λ“œ
    3. 단언 (then) : ν…ŒμŠ€νŠΈ 쀑인 λ™μž‘μ΄ μ‹€ν–‰λ˜κ³  λ‚˜λ©΄ μ‹€μ œλ‘œ μ˜¬λ°”λ₯Έ 일이 λ°œμƒν–ˆλŠ”μ§€ ν™•μΈν•˜λŠ” 것

쒋은 λ‹¨μœ„ ν…ŒμŠ€νŠΈλž€?

ν›Όμ†μ˜ μ •ν™•ν•œ 감지

  • λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ κ°€μž₯ λͺ…ν™•ν•˜κ³  주된 λͺ©ν‘œλŠ” μ½”λ“œκ°€ ν›Όμ†λ˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 것
  • 즉, μ½”λ“œκ°€ μ˜λ„λœ λŒ€λ‘œ μˆ˜ν–‰ν•˜λ©° 버그가 μ—†λ‹€λŠ” 것을 ν™•μΈν•˜λŠ” 것이닀.
  • μ΄λŸ¬ν•œ ν›Όμ†μ˜ μ •ν™•ν•œ κ°μ§€λŠ” μ•„λž˜μ™€ 같은 이점을 μ€€λ‹€.
  1. μ½”λ“œμ— λŒ€ν•œ 초기 μ‹ λ’°λ₯Ό μ€€λ‹€.
  2. 미래의 훼손을 막아쀀닀.
  • ν”Œλž˜ν‚€λž€?
    • ν…ŒμŠ€νŠΈ λŒ€μƒ μ½”λ“œκ°€ μ •μƒμž„μ—λ„ λΆˆκ΅¬ν•˜κ³  λ•Œλ‘œλŠ” ν†΅κ³Όν•˜κ³  λ•Œλ‘œλŠ” μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό μΌμ»«λŠ”λ‹€.
    • λ¬΄μž‘μœ„μ„±, 타이밍 기반 레이슀 쑰건, μ™ΈλΆ€ μ‹œμŠ€ν…œμ— μ˜μ‘΄ν•˜λŠ” λ“±μ˜ ν…ŒμŠ€νŠΈμ˜ 비결정적 λ™μž‘μ— κΈ°μΈν•œλ‹€.

μ„ΈλΆ€ κ΅¬ν˜„μ‚¬ν•­μ— 독립적

κ°œλ°œμžκ°€ μ½”λ“œλ² μ΄μŠ€μ— κ°€ν•  수 μžˆλŠ” 변경은

  • κΈ°λŠ₯적 λ³€ν™”
  • λ¦¬νŒ©ν† λ§

이 두가지이닀. 이 μ€‘μ—μ„œ λ¦¬νŒ¨ν† λ§μ„ ν–ˆμ„ λ•Œ, ν…ŒμŠ€νŠΈμ½”λ“œμ— 변경사항이 μƒκ²¨μ„œλŠ” μ•ˆλœλ‹€. ν…ŒμŠ€νŠΈκ°€ μ„ΈλΆ€κ΅¬ν˜„μ‚¬ν•­μ— 독립적일 수둝 λ¦¬νŒ©ν„°λ§μ— λŒ€ν•œ 확신을 κ°–κΈ° 쉽닀. ν…ŒμŠ€νŠΈκ°€ μ—¬μ „νžˆ 잘 ν†΅κ³Όλœλ‹€λ©΄ λ¦¬νŒ©ν„°λ§μ΄ 잘 된 것이고, ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•œλ‹€λ©΄ μ½”λ“œμ˜ λ™μž‘μ„ λ³€κ²½ν•œ μ‹€μˆ˜λ₯Ό λ²”ν•œ 것이닀.

잘 μ„€λͺ…λ˜λŠ” μ‹€νŒ¨

  • ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ 가지 μ‚¬ν•­λ§Œ κ²€μ‚¬ν•΄μ•Όν•œλ‹€.
  • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ μ„œμˆ μ μΈ 이름을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.

이해 κ°€λŠ₯ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ

  • ν•œλ²ˆμ— λ„ˆλ¬΄ λ§Žμ€ 것을 ν…ŒμŠ€νŠΈν•˜λ €κ³  ν•˜μ§€ 말 것
  • λ„ˆλ¬΄ λ§Žμ€ 곡유 ν…ŒμŠ€νŠΈ 섀정을 ν•˜μ§€ 말 것
  • ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ•Όν•˜λŠ” μ΄μœ λŠ”, 일뢀 κ°œλ°œμžλ“€μ΄ ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μ½”λ“œμ— λŒ€ν•œ μΌμ’…μ˜ μ‚¬μš©μ„€λͺ…μ„œλ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

쉽고 λΉ λ₯Έ μ‹€ν–‰

  • ν…ŒμŠ€νŠΈκ°€ 느리면, ν…ŒμŠ€νŠΈκ°€ νž˜λ“  μž‘μ—…μ΄ 되고, ν…ŒμŠ€νŠΈκ°€ νž˜λ“€λ©΄ ν•˜κ³ μ‹Άμ§€ μ•Šμ•„μ§„λ‹€.

퍼블릭 API 에 μ§‘μ€‘ν•˜λ˜, μ€‘μš”ν•œ λ™μž‘μ€ λ¬΄μ‹œν•˜μ§€ 말라

  • '퍼블릭 API λ§Œμ„ μ‚¬μš©ν•œ ν…ŒμŠ€νŠΈ'λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ κ΄€λ ¨ν•˜μ—¬ 맀우 일반적인 쑰언이닀.
  • 퍼블릭 API에 μ΄ˆμ μ„ λ§žμΆ”λ©΄ μ„ΈλΆ€ 사항이 μ•„λ‹Œ μ½”λ“œ μ‚¬μš©μžκ°€ ꢁ극적으둜 μ‹ κ²½ μ“Έ λ™μž‘μ— 집쀑할 수 밖에 μ—†κ²Œ λ˜λŠ”λ°, 세뢀사항은 λͺ©μ μ„ 이루기 μœ„ν•œ μˆ˜λ‹¨μΌ 뿐이닀.

퍼블릭 API λ°”κΉ₯에 μžˆλŠ” μ€‘μš”ν•œ λ™μž‘λ“€(μ˜μ‘΄μ„±)은 μ–΄λ–»κ²Œ ν•΄κ²°ν•΄μ•Όν• κΉŒ?

  • λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” '비ꡐ적 격리된 방식'으둜 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•΄μ•Όν•œλ‹€.
  • ν•˜μ§€λ§Œ, μ½”λ“œλŠ” λ‹€λ₯Έ 것듀에 μ˜μ‘΄ν•˜λŠ” κ²½ν–₯이 있고, μ½”λ“œμ˜ λͺ¨λ“  λ™μž‘μ„ μ™„λ²½ν•˜κ²Œ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ μ’…μ’… μž…λ ₯을 μ„€μ •ν•˜κ³  λΆ€μˆ˜νš¨κ³Όλ₯Ό κ²€μ¦ν•΄μ•Όν•œλ‹€.
  • μ˜μ‘΄μ„±μ„ μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” 것에 λŒ€ν•œ λŒ€μ•ˆμœΌλ‘œ ν…ŒμŠ€νŠΈλ”λΈ”μ΄ μžˆλ‹€.

ν…ŒμŠ€νŠΈ 더블을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

  • ν…ŒμŠ€νŠΈ λ‹¨μˆœν™”
    • 일뢀 μ˜μ‘΄μ„±μ€ ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•˜κΈ° κΉŒλ‹€λ‘­κ³  νž˜λ“€λ‹€. μ˜μ‘΄μ„±μ€ λ§Žμ€ 섀정이 ν•„μš”ν•˜κ±°λ‚˜ ν•˜μœ„ μ˜μ‘΄μ„±μ„ μ„€μ •ν•΄μ•Όν•  수 μžˆλ‹€.
    • 이러면 ν…ŒμŠ€νŠΈλŠ” λ³΅μž‘ν•˜κ³  κ΅¬ν˜„ 세뢀사항과 λ°€μ ‘ν•˜κ²Œ κ²°ν•© 될 수 μžˆλ‹€.
    • λ”°λΌμ„œ μ˜μ‘΄μ„±μ„ μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” λŒ€μ‹ , ν…ŒμŠ€νŠΈ 더블을 μ‚¬μš©ν•˜λ©΄ μž‘μ—…μ΄ λ‹¨μˆœν•΄μ§„λ‹€.
  • ν…ŒμŠ€νŠΈλ‘œλΆ€ν„° 외뢀세계 보호
    • 일뢀 μ˜μ‘΄μ„±μ€ μ‹€μ œλ‘œ λΆ€μˆ˜νš¨κ³Όλ₯Ό λ°œμƒν•œλ‹€. μ½”λ“œμ˜ 쒅속성 쀑 ν•˜λ‚˜κ°€ μ‹€μ œ μ„œλ²„μ— μš”μ²­μ„ μ „μ†‘ν•˜κ±°λ‚˜ μ‹€μ œ DB에 값을 μ“°κ²Œ 되면 μ‚¬μš©μžλ‚˜ λΉ„μ¦ˆλ‹ˆμŠ€μ— μ€‘μš”ν•œ ν”„λ‘œμ„ΈμŠ€μ— λ‚˜μœ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€.
    • μ΄λŸ¬ν•œ μƒν™©μ—μ„œ ν…ŒμŠ€νŠΈ 더블을 μ‚¬μš©ν•˜λ©΄ μ™ΈλΆ€ 세계에 μžˆλŠ” μ‹œμŠ€ν…œμ„ ν…ŒμŠ€νŠΈ λ™μž‘μœΌλ‘œλΆ€ν„° λ³΄ν˜Έν•  수 μžˆλ‹€.
  • μ™ΈλΆ€λ‘œλΆ€ν„° ν…ŒμŠ€νŠΈ 보호
    • μ™ΈλΆ€ μ„Έκ³„λŠ” 비결정적일 수 μžˆλ‹€. λ‹€λ₯Έ μ‹œμŠ€ν…œμ΄ λ°μ΄ν„°λ² μ΄μŠ€μ— μ“΄ 값을 μ˜μ‘΄μ„± μ½”λ“œκ°€ μ½λŠ”λ‹€λ©΄ 이 값은 μ‹œκ°„μ΄ 지남에 따라 변경될 수 μžˆλ‹€. 이 경우 ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό μ‹ λ’°ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆλ‹€. (ν”Œλž˜ν‚€)
    • λ°˜λ©΄μ— ν…ŒμŠ€νŠΈ 더블은 항상 λ™μΌν•˜κ²Œ 결정적 λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ μ„€μ • κ°€λŠ₯ν•˜λ‹€.