# [[Unit Testing]] ## πŸ“Œ Brief Summary μœ λ‹› ν…ŒμŠ€νŠΈ(Unit Testing)λŠ” ν…ŒμŠ€νŠΈ μžλ™ν™” ν”ΌλΌλ―Έλ“œμ˜ κΈ°λ°˜μ„ ν˜•μ„±ν•˜λ©° μ•ˆμ „ν•œ λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ ν•„μˆ˜μ μΈ μ „μ œ μ‘°κ±΄μž…λ‹ˆλ‹€ [1-3]. μ΄λŠ” κ°œλ³„ μ»΄ν¬λ„ŒνŠΈλ‚˜ ν•¨μˆ˜μ˜ λ™μž‘μ„ κ²©λ¦¬ν•˜μ—¬ κ²€μ¦ν•˜λŠ” μž‘κ³  λΉ λ₯Έ 독립적인 ν…ŒμŠ€νŠΈλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€ [1, 4]. μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ…μ„Έμ„œμ΄μž κ°€λ“œλ ˆμΌ 역할을 ν•¨μœΌλ‘œμ¨, κ°œλ°œμžκ°€ μ½”λ“œμ˜ μ™ΈλΆ€ λ™μž‘μ„ λ³€κ²½ν•˜μ§€ μ•Šκ³  λ‚΄λΆ€ ꡬ쑰λ₯Ό κ°œμ„ ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” 결함을 λ°©μ§€ν•˜κ³  즉각적인 ν”Όλ“œλ°±μ„ μ œκ³΅ν•©λ‹ˆλ‹€ [1, 5, 6]. ## πŸ“– Core Content * **μœ λ‹› ν…ŒμŠ€νŠΈμ˜ μ •μ˜μ™€ νŠΉμ„±**: μœ λ‹› ν…ŒμŠ€νŠΈλŠ” μ½”λ“œλ² μ΄μŠ€μ—μ„œ κ°€μž₯ 쒁은 λ²”μœ„λ₯Ό 닀루며, νŠΉμ • μ»΄ν¬λ„ŒνŠΈλ‚˜ λ©”μ„œλ“œκ°€ μ˜λ„ν•œ λŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€ [4]. 마이클 νŽ˜λ”μŠ€(Michael Feathers)λŠ” μ‹€ν–‰ 속도가 λ„ˆλ¬΄ λŠλ¦¬κ±°λ‚˜(예: ν…ŒμŠ€νŠΈλ‹Ή 100ms 초과), λ°μ΄ν„°λ² μ΄μŠ€, λ„€νŠΈμ›Œν¬, 파일 μ‹œμŠ€ν…œ λ“± μ™ΈλΆ€ 인프라와 ν†΅μ‹ ν•˜λŠ” ν…ŒμŠ€νŠΈλŠ” μ§„μ •ν•œ 의미의 μœ λ‹› ν…ŒμŠ€νŠΈκ°€ μ•„λ‹ˆλΌκ³  μ •μ˜ν–ˆμŠ΅λ‹ˆλ‹€ [4, 7, 8]. * **λ¦¬νŒ©ν† λ§ κ³Όμ •μ—μ„œμ˜ ν•„μˆ˜ μ—­ν• **: λ¦¬νŒ©ν† λ§μ„ μ‹œμž‘ν•˜κΈ° μ „μ—λŠ” λ°˜λ“œμ‹œ μ½”λ“œκ°€ μžκ°€ ν…ŒμŠ€νŠΈ(Self-testing)κ°€ κ°€λŠ₯ν•˜λ„λ‘ κ²¬κ³ ν•œ μœ λ‹› ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό ꡬ좕해야 ν•©λ‹ˆλ‹€ [2, 3, 6]. ν…ŒμŠ€νŠΈ 주도 개발(TDD)의 'Red-Green-Refactor' 원칙에 따라, ν…ŒμŠ€νŠΈλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ³€κ²½ν•˜μ§€ μ•Šκ³  μ΅œμ ν™”λ₯Ό μ§„ν–‰ν•  수 있게 ν•˜λŠ” μ•ˆμ „λ§ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€ [9-12]. λ˜ν•œ 버그가 λ³΄κ³ λ˜μ—ˆμ„ λ•ŒλŠ” ν•΄λ‹Ή 버그λ₯Ό λ“œλŸ¬λ‚΄λŠ” μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μž‘μ„±ν•œ ν›„ μˆ˜μ •ν•˜λŠ” 것이 λͺ¨λ²” μ‚¬λ‘€μž…λ‹ˆλ‹€ [13, 14]. * **ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œμ™€ μ‹€ν–‰ 속도**: μœ λ‹› ν…ŒμŠ€νŠΈλŠ” μž‘μ„±κ³Ό μœ μ§€λ³΄μˆ˜ λΉ„μš©μ΄ μ €λ ΄ν•˜κ³  λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œμ˜ μ΅œν•˜λ‹¨μ„ ꡬ성해야 ν•©λ‹ˆλ‹€ [1]. κ±΄κ°•ν•œ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλΌλ©΄ 전체 μžλ™ν™” ν…ŒμŠ€νŠΈμ˜ μ•½ 70%κ°€ μœ λ‹› ν…ŒμŠ€νŠΈλ‘œ 이루어져야 ν•˜λ©°, κ°•λ ₯ν•œ 격리λ₯Ό 톡해 수 λΆ„ 내에 수천 개의 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€ [1, 15]. * **κ³ λ¦½ν˜•(Solitary) vs μ‚¬κ΅ν˜•(Sociable) ν…ŒμŠ€νŠΈ**: μ™ΈλΆ€ μ˜μ‘΄μ„±μœΌλ‘œ μΈν•œ λΆ€μˆ˜ 효과λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ λͺ©(Mock)μ΄λ‚˜ μŠ€ν…(Stub)κ³Ό 같은 ν…ŒμŠ€νŠΈ λŒ€μ—­(Test Double)을 μ‚¬μš©ν•˜μ—¬ κ²©λ¦¬ν•˜λŠ” 'κ³ λ¦½ν˜•' ν…ŒμŠ€νŠΈμ™€, μ‹€μ œ ν˜‘λ ₯ 객체λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λŠ” 'μ‚¬κ΅ν˜•' ν…ŒμŠ€νŠΈ 방식이 λͺ¨λ‘ ν™œμš©λ©λ‹ˆλ‹€ [16-18]. * **ꡬ쑰와 섀계 λͺ¨λ²” 사둀**: μœ λ‹› ν…ŒμŠ€νŠΈλŠ” λ‚΄λΆ€ κ΅¬ν˜„ μ„ΈλΆ€ 사항이 μ•„λ‹ˆλΌ 클래슀의 '퍼블릭 μΈν„°νŽ˜μ΄μŠ€'와 'κ΄€μΈ‘ κ°€λŠ₯ν•œ λ™μž‘(Observable Behaviour)'을 ν…ŒμŠ€νŠΈν•˜λŠ” 데 집쀑해야 ν•©λ‹ˆλ‹€ [19, 20]. λ˜ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± μ‹œμ—λŠ” 데이터 μ„€μ •(Arrange), λŒ€μƒ λ©”μ„œλ“œ 호좜(Act), κ²°κ³Ό 검증(Assert)의 3단계 ꡬ쑰λ₯Ό λ”°λ₯΄λŠ” 것이 가독성과 일관성을 λ†’μ—¬μ€λ‹ˆλ‹€ [21]. ## βš–οΈ Trade-offs & Caveats * **κ΅¬ν˜„μ— λŒ€ν•œ κ³Όλ„ν•œ κ²°ν•©(Brittle Tests)**: μœ λ‹› ν…ŒμŠ€νŠΈκ°€ λ‚΄λΆ€ μ½”λ“œ κ΅¬μ‘°λ‚˜ 프라이빗 λ©”μ„œλ“œ(Private Method)의 κ΅¬ν˜„μ— λ„ˆλ¬΄ λ°€μ ‘ν•˜κ²Œ κ²°ν•©λ˜λ©΄, λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ ν…ŒμŠ€νŠΈκ°€ κΉ¨μ§€κ²Œ λ©λ‹ˆλ‹€ [19, 22, 23]. λ‚΄λΆ€ κ΅¬ν˜„μ΄ λ°”λ€” λ•Œλ§ˆλ‹€ μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈλŠ” μœ μ§€λ³΄μˆ˜μ˜ 뢀담을 κ°€μ€‘μ‹œν‚€κ³  λ¦¬νŒ©ν† λ§μ˜ μ•ˆμ „λ§μ΄λΌλŠ” 본래 λͺ©μ μ„ ν›Όμ†ν•˜μ—¬ 개발자의 ν”Όλ‘œλ„λ₯Ό λ†’μž…λ‹ˆλ‹€ [20]. * **λ‹¨μˆœ μ½”λ“œ ν…ŒμŠ€νŠΈ 및 100% 컀버리지 μΆ”κ΅¬μ˜ 함정**: λ‹¨μˆœν•œ Getter/Setterλ‚˜ λ³΅μž‘ν•œ 쑰건 둜직이 μ—†λŠ” μ‚¬μ†Œν•œ μ½”λ“œκΉŒμ§€ λͺ¨λ‘ ν…ŒμŠ€νŠΈν•˜μ—¬ 100% 컀버리지λ₯Ό λ‹¬μ„±ν•˜λ €λŠ” λ…Έλ ₯은 μ‹œκ°„ 낭비이며 μˆ˜ν™• 체감의 법칙에 μ§λ©΄ν•˜κ²Œ λ©λ‹ˆλ‹€ [21, 24-26]. ν…ŒμŠ€νŠΈλŠ” 결함이 λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μœ„ν—˜μ„±κ³Ό λ³΅μž‘μ„±μ΄ 높은 μ˜μ—­μ— μ§‘μ€‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [25, 27]. * **톡합 문제 발견의 ν•œκ³„**: μœ λ‹› ν…ŒμŠ€νŠΈλŠ” κ°œλ³„ μ»΄ν¬λ„ŒνŠΈμ˜ λ™μž‘λ§Œ κ²©λ¦¬ν•˜μ—¬ ν™•μΈν•˜λ―€λ‘œ, λ…λ¦½μ μœΌλ‘œλŠ” μ˜¬λ°”λ₯Έ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μ„œλ‘œ μƒν˜Έμž‘μš©ν•  λ•Œ λ°œμƒν•˜λŠ” 결함은 μž‘μ•„λ‚Ό 수 μ—†μŠ΅λ‹ˆλ‹€ [28]. λ”°λΌμ„œ μœ λ‹› ν…ŒμŠ€νŠΈμ—λ§Œ μ˜μ‘΄ν•˜λ©΄ μ•ˆ 되며, 톡합 ν…ŒμŠ€νŠΈ(Integration Tests)λ‚˜ E2E ν…ŒμŠ€νŠΈ λ“± μƒμœ„ κ³„μΈ΅μ˜ ν…ŒμŠ€νŠΈλ₯Ό λ³‘ν–‰ν•˜μ—¬ μ‹€μ œ ν™˜κ²½μ—μ„œμ˜ 문제λ₯Ό μ˜ˆλ°©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [28-30]. * **AI 생성 ν…ŒμŠ€νŠΈμ˜ ν•œκ³„**: λŒ€κ·œλͺ¨ μ–Έμ–΄ λͺ¨λΈ(LLM)을 ν™œμš©ν•˜μ—¬ μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό μžλ™ 생성할 경우, ν…ŒμŠ€νŠΈ μ»€λ²„λ¦¬μ§€μ˜ ν•œκ³„μ— λΆ€λ”ͺνžˆκ±°λ‚˜ λͺ¨ν‚Ή(Mocking) κΈ°λŠ₯이 λΆ€μ‘±ν•˜κ³  ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ‰½κ²Œ κΉ¨μ§€λŠ”(brittleness) λΆ€μž‘μš©μ΄ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ, μ μ ˆν•œ ν”„λ‘¬ν”„νŒ… 기법과 개발자의 μ² μ €ν•œ κ²€ν† κ°€ λ™λ°˜λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [5, 31, 32]. --- *Last updated: 2026-05-03*