Chapter 12-1 Django TDD(Test-Driven Development)란?

2025. 5. 19. 18:17·Django

✅ TDD(Test-Driven Development)란?

TDD는 테스트를 먼저 작성하고, 그 테스트를 통과하는 코드를 나중에 작성하는 개발 방법론입니다.

🔁 핵심 사이클 (Red → Green → Refactor)

  1. Red: 실패하는 테스트 작성
  2. Green: 테스트 통과를 위한 최소 코드 작성
  3. Refactor: 중복 제거 및 코드 개선

📌 TDD의 장
점과 단점

✔️ 장점

  • 코드 품질 향상: 동작 보장이 명확
  • 버그 예방: 요구사항 기반 테스트
  • 안정된 리팩토링: 변경 후에도 테스트로 기능 확인 가능
  • 요구사항 명확화: 테스트를 작성하며 요구를 구체화

❌ 단점

  • 초기 시간 소모: 테스트 작성 시간 필요
  • 복잡성 증가: 로직이 복잡할수록 테스트도 어려움
  • 테스트 과잉 위험: 비효율적인 테스트 증가 가능

✅ setUp() 메서드를 포함한 예시

from django.test import TestCase
from .models import MyModel

class MyModelTest(TestCase):
    def setUp(self):
        # 테스트 전에 실행되는 설정 코드
        self.my_model = MyModel.objects.create(name="Test")

    def test_model_creation(self):
        # setUp에서 만든 객체 사용
        self.assertEqual(self.my_model.name, "Test")

 


📌 정리

메서드역할
setUp() 각 테스트 메서드가 실행되기 직전에 항상 호출됨. 테스트에 필요한 공통 객체를 초기화
test_... 실제로 테스트를 수행하는 메서드. 이름이 test_로 시작해야 테스트로 인식됨
 

🧠 팁

  • setUp()은 각 테스트마다 새로 실행되므로 테스트 간 독립성을 유지할 수 있음.
  • 여러 테스트에서 동일한 데이터를 사용할 경우 코드 중복을 줄일 수 있음.

🧪 Django에서의 테스트 코드 작성

Django는 unittest 기반의 테스트 프레임워크를 자체 제공하며, 각 앱의 tests.py 또는 별도 tests/ 폴더에서 테스트 코드를 작성합니다.

from django.test import TestCase
from .models import MyModel

class MyModelTest(TestCase):
    def test_model_creation(self):
        my_model = MyModel.objects.create(name="Test")
        self.assertEqual(my_model.name, "Test")

🔨 Django에서의 TDD 실천 순서

1. 테스트 작성 (Red 단계)

def test_example(self):
    response = self.client.get('/my-url/')
    self.assertEqual(response.status_code, 200)

2. 최소한의 코드 작성 (Green 단계)

from django.http import HttpResponse

def my_view(request):
    return HttpResponse("Hello, World!")

3. 리팩토링 (Refactor 단계)

  • 중복 제거
  • 메서드 분리
  • 코드 간결화 등

🧰 주요 테스트 유형 예시

📦 모델 테스트

class MyModelTest(TestCase):
    def test_str_method(self):
        my_model = MyModel(name="Test")
        self.assertEqual(str(my_model), "Test")

🌐 뷰 테스트

from django.urls import reverse

class MyViewTest(TestCase):
    def test_view_url_exists(self):
        response = self.client.get(reverse('my_view'))
        self.assertEqual(response.status_code, 200)

📝 폼 테스트

from .forms import MyForm

class MyFormTest(TestCase):
    def test_valid_form(self):
        form = MyForm(data={'name': 'Test'})
        self.assertTrue(form.is_valid())

    def test_invalid_form(self):
        form = MyForm(data={'name': ''})
        self.assertFalse(form.is_valid())

📣 시그널 테스트

class MySignalTest(TestCase):
    def test_post_save_signal(self):
        with self.assertLogs('myapp', level='INFO') as cm:
            MyModel.objects.create(name="Test")
        self.assertIn('Signal triggered', cm.output[0])

🧪 테스트 실행 방법

전체 테스트 실행

python manage.py test

특정 앱 테스트 실행

python manage.py test <app_name>

📚 참고자료

  • Django 공식문서: https://docs.djangoproject.com/en/stable/topics/testing/
  • Kent Beck, Test-Driven Development by Example
  • Python unittest 공식문서: https://docs.python.org/3/library/unittest.html

'Django' 카테고리의 다른 글

Chapter 14-2 SimpleJWT 완전 정복 가이드  (0) 2025.05.21
Chapter 14-1 drf-yasg 사용법 완전 정리  (0) 2025.05.21
Chapter 11-5 Django Mini Project - GitHub OAuth2 로그인 구현  (0) 2025.05.16
Chapter 11-4 Django에서 네이버 OAuth2 로그인 구현하기  (0) 2025.05.16
Chapter 11-3 Django OAuth2 완전 정복 - 인증과 권한 부여의 표준 프레임워크  (0) 2025.05.16
'Django' 카테고리의 다른 글
  • Chapter 14-2 SimpleJWT 완전 정복 가이드
  • Chapter 14-1 drf-yasg 사용법 완전 정리
  • Chapter 11-5 Django Mini Project - GitHub OAuth2 로그인 구현
  • Chapter 11-4 Django에서 네이버 OAuth2 로그인 구현하기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (702)
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (40)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 12-1 Django TDD(Test-Driven Development)란?
상단으로

티스토리툴바