πŸ€– Backend/Test

λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈ

sckwon770 2024. 2. 25. 20:13

이전 λ…Έμ…˜ λΈ”λ‘œκ·Έμ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈ (2023.03.13)λ‘œλΆ€ν„° λ§ˆμ΄κ·Έλ ˆμ΄μ…˜λœ κΈ€μž…λ‹ˆλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈ vs 톡합 ν…ŒμŠ€νŠΈ

λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Test)λŠ” ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ κΈ°μ€€μœΌλ‘œ λ…λ¦½μ μœΌλ‘œ μ§„ν–‰λ˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ ν…ŒμŠ€νŠΈμ΄λ‹€. μ—¬κΈ°μ„œ λͺ¨λ“ˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μž‘λ™ν•˜λŠ” ν•˜λ‚˜μ˜ κΈ°λŠ₯ λ˜λŠ” λ©”μ†Œλ“œλ‘œ 이해할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ›Ήμ—μ„œ 둜그인 λ©”μ†Œλ“œμ— λŒ€ν•œ 독립적인 ν…ŒμŠ€νŠΈκ°€ 1개의 λ‹¨μœ„ν…ŒμŠ€νŠΈκ°€ 될 수 μžˆλ‹€.

즉, λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” “μ–΄λ–€ κΈ°λŠ₯이 μ‹€ν–‰λ˜λ©΄ μ–΄λ–€ κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€" μ •λ„λ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•œλ‹€.

톡합 ν…ŒμŠ€νŠΈ(Integration Test)λŠ” λͺ¨λ“ˆμ„ ν†΅ν•©ν•˜λŠ” κ³Όμ •μ—μ„œ λͺ¨λ“ˆ κ°„μ˜ ν˜Έν™˜μ„±μ„ ν™•μΈν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰λ˜λŠ” ν…ŒμŠ€νŠΈμ΄λ‹€. 일반적으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ—¬λŸ¬ 개의 λͺ¨λ“ˆλ“€λ‘œ ꡬ성이 되고, λͺ¨λ“ˆλ“€λΌλ¦¬ μƒν˜Έμž‘μš©ν•œλ‹€. 그렇기에 ν†΅ν•©λœ λͺ¨λ“ˆλ“€μ΄ μ˜¬λ°”λ₯΄κ²Œ μ—°κ³„λ˜μ–΄ λ™μž‘ν•˜λŠ”μ§€ 검증이 ν•„μš”ν•œλ°, μ΄λŸ¬ν•œ λͺ©μ μœΌλ‘œ μ§„ν–‰λ˜λŠ” ν…ŒμŠ€νŠΈκ°€ 톡합 ν…ŒμŠ€νŠΈμ΄λ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„±μ˜ ν•„μš”μ„±

λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„±μ˜ ν•„μš”μ„±

톡합 ν…ŒμŠ€νŠΈλŠ” μ‹€μ œ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈλ“€ κ°„μ˜ μƒν˜Έμž‘μš©μ„ ν…ŒμŠ€νŠΈν•˜κΈ° λ•Œλ¬Έμ— μ»΄ν¬λ„ŒνŠΈλ“€μ΄ κ΅¬λ™λœ μƒνƒœμ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κ²Œ λœλ‹€. 그렇기에 톡합 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄μ„œλŠ” μΊμ‹œλ‚˜ DB 등이 μ‹€μ œ 연결을 ν•΄μ•Όν•˜κ³ , μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λΉ„μš©μ΄ μƒλ‹Ήνžˆ 컀진닀. 반면 λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” ν•΄λ‹Ή λΆ€λΆ„λ§Œ λ…λ¦­μ ‘μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜κΈ° λ•Œλ¬Έμ— λΉ λ₯΄κ²Œ 문제 μ—¬λΆ€λ₯Ό 확인할 수 μžˆλ‹€.

  • ν…ŒμŠ€νŒ…μ— λŒ€ν•œ μ‹œκ°„κ³Ό λΉ„μš©μ„ 절감
  • μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ μ‹œμ— μˆ˜μ‹œλ‘œ λΉ λ₯΄κ²Œ ν…ŒμŠ€νŠΈ κ°€λŠ₯
  • λ¦¬νŒ©ν† λ§ μ‹œμ— μ•ˆμ •μ„± 확보
  • μ½”λ“œμ— λŒ€ν•œ λ¬Έμ„œλ‘œμ„œ μ‚¬μš©

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ‹€λ¬΄μ—μ„œλŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ„ ν˜Έν•˜λ©°, TDDμ—μ„œ μ• κΈ°ν•˜λŠ” ν…ŒμŠ€νŠΈλ„ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ˜λ―Έν•œλ‹€. μš°λ¦¬λŠ” μš°λ¦¬κ°€ μž‘μ„±ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μˆ˜μ‹œλ‘œ λΉ λ₯΄κ²Œ λŒλ¦¬λ©΄μ„œ 문제λ₯Ό νŒŒμ•…ν•  수 μžˆλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ 문제점과 Stub

μ–΄λ–€ 객체가 자체적으둜 λͺ¨λ“  일을 μ²˜λ¦¬ν•œλ‹€λ©΄ λ¬Έμ œκ°€ μ—†κ² μ§€λ§Œ, 일반적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 1개의 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ 객체듀과 μƒν˜Έμž‘μš©ν•΄μ•Ό ν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ 객체 λŒ€μ‹  κ°€μ§œ 객체(Mock Object)λ₯Ό μ£Όμž…ν•˜μ—¬ μ–΄λ–€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λΌκ³  μ •ν•΄μ§„ 닡변을 μ€€λΉ„μ‹œμΌœμ•Ό ν•˜λŠ”λ°, 이λ₯Ό stub이라고 ν•œλ‹€.

예λ₯Ό λ“€μ–΄ DB에 μƒˆλ‘œμš΄ 데이터λ₯Ό μΆ”κ°€ν•˜λŠ” μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€κ³  ν•˜λ©΄, Mock DBλ₯Ό μ£Όμž…ν•˜μ—¬ insert 처리 μ‹œμ— λ°˜λ“œμ‹œ 1λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•΄μ£ΌλŠ” 것이 stub이닀.

쒋은 λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ νŠΉμ§•

μš”κ΅¬μ‚¬ν•­μ€ 계속 λ³€ν•˜κ³ , 그에 맞좰 μ½”λ“œ μ—­μ‹œ λ³€ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ μ‹€μ œ μ½”λ“œλ₯Ό λ³€κ²½ν•œλ‹€λŠ” 것은 잠재적인 버그가 λ°œμƒν•  수 μžˆμŒμ„ λ‚΄ν¬ν•˜λŠ”λ°, 쒋은 ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μžˆλ‹€λ©΄ λ³€κ²½λœ μ½”λ“œλ₯Ό κ²€μ¦ν•¨μœΌλ‘œμ¨ ν•΄κ²°ν•  수 μžˆλ‹€. λ˜ν•œ μ‹€μ œ μ½”λ“œκ°€ λ³€κ²½λ˜λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œ μ—­μ‹œ 변경이 ν•„μš”ν•  수 μžˆλŠ”λ°, μ΄λŸ¬ν•œ 이유둜 ν…ŒμŠ€νŠΈ μ½”λ“œ μ—­μ‹œ κ°€λ…μ„±μžˆκ²Œ μž‘μ„±ν•  ν•„μš”κ°€ μžˆλ‹€.

그렇기에 λ‹€μŒμ„ μ€€μˆ˜ν•΄μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이 μ’‹λ‹€.

  1. 1개의 ν…ŒμŠ€νŠΈ ν•¨μˆ˜μ— λŒ€ν•΄ assertλ₯Ό μ΅œμ†Œν™”ν•˜λΌ
  2. 1개의 ν…ŒμŠ€νŠΈ ν•¨μˆ˜λŠ” 1κ°€μ§€ κ°œλ… λ§Œμ„ ν…ŒμŠ€νŠΈν•˜λΌ

λ˜ν•œ μ’‹κ³  κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” FIRST κ·œμΉ™μ„ 따라야 ν•œλ‹€.

  1. Fast: ν…ŒμŠ€νŠΈλŠ” λΉ λ₯΄κ²Œ λ™μž‘ν•˜μ—¬ 자주 돌릴 수 μžˆμ–΄μ•Ό ν•œλ‹€.
  2. Independent: 각각의 ν…ŒμŠ€νŠΈλŠ” 독립적이며 μ„œλ‘œ μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλœλ‹€.
  3. Repeatable: μ–΄λŠ ν™˜κ²½μ—μ„œλ„ 반볡 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  4. Self-Validating: ν…ŒμŠ€νŠΈλŠ” 성곡 λ˜λŠ” μ‹€νŒ¨λ‘œ κ²°κ³Όλ₯Ό λ„μΆœν•˜κ³  자체적으둜 κ²€μ¦λ˜μ–΄μ•Ό ν•œλ‹€.
  5. Timely: ν…ŒμŠ€νŠΈν•˜λ €λŠ” μ‹€μ œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ° 직전에 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈλΌλŠ” 이름 μ•„λž˜μ— Spring의 λͺ¨λ“  λΉˆμ„ λ„μ›Œμ„œ, μž‘μ„±ν•œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ”λ°λ§Œ λͺ‡ λΆ„μ˜ μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆμ—ˆλ‹€. μ΄λ ‡κ²Œ 였랜 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” ν…ŒμŠ€νŠΈλŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ μž₯점이 μ—†μ–΄μ§„ κ²ƒμ΄λ‚˜ λ§ˆμ°¬κ°€μ§€λ‹€.