λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Programming/Django

πŸ§ͺ ν…ŒμŠ€νŠΈ 주도 개발(TDD) μ™„λ²½ κ°€μ΄λ“œ

by Mandy's 2025. 8. 4.

πŸ“Œ 1. TDDλž€ 무엇인가?

TDDλž€?

TDD(Test-Driven Development, ν…ŒμŠ€νŠΈ 주도 개발)λŠ”
κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° 전에 ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μž‘μ„±ν•˜κ³ ,
κ·Έ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜λŠ” μ½”λ“œλ₯Ό λ§Œλ“  λ’€ λ¦¬νŒ©ν„°λ§ν•˜λŠ” 개발 λ°©μ‹μž…λ‹ˆλ‹€.

ν•œλ§ˆλ””λ‘œ, ν…ŒμŠ€νŠΈκ°€ κ°œλ°œμ„ μ΄λ„λŠ” 방식이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. πŸš€


πŸ”„ 2. TDD 핡심 사이클 (Red → Green → Refactor)

  1. πŸ”΄ Red – μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μž‘μ„±
    κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° 전에 μ‹€νŒ¨ν•  μˆ˜λ°–μ— μ—†λŠ” ν…ŒμŠ€νŠΈ μž‘μ„±
    → μ‹€ν–‰ν•˜μ—¬ ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•˜λŠ”μ§€ 확인
  2. 🟒 Green – ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜λŠ” μ΅œμ†Œν•œμ˜ μ½”λ“œ μž‘μ„±
    κ°€μž₯ λ‹¨μˆœν•˜κ²Œ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όμ‹œν‚€λŠ” μ½”λ“œ κ΅¬ν˜„
    → μš°μ„ μ€ “톡과”κ°€ λͺ©ν‘œ
  3. β™» Refactor – μ½”λ“œ κ°œμ„ 
    쀑볡 제거, 가독성 ν–₯상, ꡬ쑰 κ°œμ„ 
    → λ¦¬νŒ©ν„°λ§ 후에도 ν…ŒμŠ€νŠΈλŠ” λͺ¨λ‘ 톡과해야 함

πŸ–₯ 3. Python μ˜ˆμ‹œ (pytest 기반)

3.1 πŸ”΄ μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μž‘μ„±

아직 add() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ§€ μ•Šμ€ μƒνƒœμ—μ„œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

# test_calculator.py
from calculator import add

def test_add():
    assert add(2, 3) == 5

μ‹€ν–‰:

pytest
# κ²°κ³Ό: Failed ❌ (μ˜ˆμƒλŒ€λ‘œ μ‹€νŒ¨)

3.2 🟒 μ΅œμ†Œν•œμ˜ μ½”λ“œ μž‘μ„±

ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όμ‹œν‚€κΈ° μœ„ν•΄ κ°€μž₯ κ°„λ‹¨ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

# calculator.py
def add(a, b):
    return a + b

μ‹€ν–‰:

pytest
# κ²°κ³Ό: Passed βœ…

3.3 β™» λ¦¬νŒ©ν„°λ§

ν•„μš”ν•˜λ‹€λ©΄ 쀑볡 제거, 넀이밍 κ°œμ„ , κΈ°λŠ₯ ν™•μž₯ 등을 μ§„ν–‰ν•©λ‹ˆλ‹€.

# calculator.py (μΆ”κ°€ κΈ°λŠ₯)
def subtract(a, b):
    return a - b
# test_calculator.py
from calculator import add, subtract

def test_add():
    assert add(2, 3) == 5

def test_subtract():
    assert subtract(5, 3) == 2

🌐 4. Djangoμ—μ„œμ˜ TDD μ˜ˆμ‹œ

Djangoμ—μ„œλŠ” TestCase둜 λ·°/λͺ¨λΈ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•œ λ’€ κ΅¬ν˜„μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

# blog/tests.py
from django.test import TestCase
from django.urls import reverse

class PostViewTest(TestCase):
    def test_post_list_page(self):
        response = self.client.get(reverse("blog:list"))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "λΈ”λ‘œκ·Έ κΈ€ λͺ©λ‘")

βœ… 5. TDD μž₯점

  • πŸ” κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­μ΄ λͺ…확해짐
  • 🐞 버그λ₯Ό 쑰기에 발견 κ°€λŠ₯
  • πŸ›‘ λ¦¬νŒ©ν„°λ§ μ‹œ μ•ˆμ •μ„± 보μž₯
  • πŸ’‘ μœ μ§€λ³΄μˆ˜ 효율 μƒμŠΉ

⚠️ 6. TDD 단점

  • ⏳ 초기 개발 속도가 느렀질 수 있음
  • 🧩 ν…ŒμŠ€νŠΈ μž‘μ„±μ— μ΅μˆ™ν•΄μ Έμ•Ό 함
  • πŸ”„ μš”κ΅¬μ‚¬ν•­ λ³€ν™” μ‹œ ν…ŒμŠ€νŠΈ μ½”λ“œλ„ ν•¨κ»˜ μˆ˜μ • ν•„μš”

🏁 7. 마무리

TDDλŠ” λ‹¨μˆœν•œ 기술이 μ•„λ‹ˆλΌ 개발 λ¬Έν™”μž…λ‹ˆλ‹€.
μ²˜μŒμ—λŠ” λ²ˆκ±°λ‘­μ§€λ§Œ, ν”„λ‘œμ νŠΈκ°€ 컀질수둝 μ•ˆμ •μ„±κ³Ό 생산성을 λ†’μ—¬μ€λ‹ˆλ‹€.
ν•œ 번 μŠ΅κ΄€μ΄ 되면, ν…ŒμŠ€νŠΈ 없이 κ°œλ°œν•˜λŠ” 게 λΆˆμ•ˆν•΄μ§ˆ 정도가 λ©λ‹ˆλ‹€. πŸ˜„