728x90
✅ 1. Django 테스트 기본
Django는 unittest 모듈 기반의 django.test.TestCase 클래스를 제공하며 각 특징은 다음과 같습니다.
- 유닛 테스트(Unit Test): 작은 단위(모델 메서드, 유틸 함수 등)를 독립적으로 검증함
- 통함 테스트(Integration Test): 여러 컴포넌트(뷰, URL, DB 등) 실제로 연결해 검증함
myapp/
└── tests.py # 또는 tests/ 디렉토리
# settings.py 수정
STATICFILES_DIRS = [
BASE_DIR / "myapp" / "static", # 프로젝트 내 static 디렉토리
]
✅ 2. 유닛 테스트 예시 (모델 / 유틸 함수 검증)
models.py에 포스트 모델이 있다고 가정합시다
# myapp/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200) # Title
content = models.TextField() # SubScribe
def short_title(self):
return self.title[:10]
👉 이 모델의 short_title() 메서드만 단위로 테스트합니다.
# blog/tests/test_models.py
from django.test import TestCase
from myapp.models import Post
class PostModelTest(TestCase):
def test_short_title_returns_first_10_chars(self):
post = Post.objects.create(title="Django Unit Test!", content="...")
self.assertEqual(post.short_title(), "Django Uni")
✅ 3. 통합 테스트 예시 (뷰 & URL & DB 연동)
블로그 글 상세 페이지를 테스트해 보겠습니다.
# myapp/views.py
from django.shortcuts import get_object_or_404, render
from .models import Post
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, "blog/post_detail.html", {"post", post})
📌 이 views를 실제 HTTP 요청처럼 테스트하려면 다음과 같습니다
# myapp/test_views.py
from django.test import TestCase
from django.urls import reverse
from myapp.models import Post
class PostViewTest(TestCase):
def setUp(self):
self.post = Post.objects.create(title="테스트 제목", content="테스트용 본문입니다")
def test_post_detail_view_success(self):
url = reverse("post_detail", args=[self.post.pk])
response = self.client.get(url)
# HTTP 상태 코드 확인
self.assertEqual(response.status_code, 200)
# 템플릿 사용 확인
self.assertTemplateUsed(response, "myapp/post_detail.html")
# 컨텍스트 데이터 확인
self.assertContains(response, "테스트 제목")
self.assertContains(response, "테스트 본문")
def test_post_detail_view_not_found(self):
url = reverse("post_detail", args=[9999]) # 없는 글
response = self.client.get(url)
self.assertEqual(response.status_code, 404)
여기선 self.client.get()을 사용해 가상의 브라우저 요청을 보내고, URL -> 뷰 -> 템플릿 -> DB 흐름 전체를 검증 = 통합 테스트순으로 요청을 보냅니다
✅ 4. API 통합 테스트
# blog/tests/test_api.py
from rest_framewort.test import APITestCase
from rest_framework import status
from django.urls import reverse
from myapp.models import Post
class PostAPITest(APITestCase):
def setUp(self):
self.post = Post.objects.create(title="API 테스트", content="본문")
self.url = reverse("post-list") # e.g. /api/posts/
def test_get_post_list(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]["title"], "API 테스트")
def test_create_post(self):
data = { "title": "새 글", "content": "새 본문 " }
response = self.client.post(self.url, data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Post.objects.count(), 2)
✅ 5. 실행 테스트
# 전체 테스트 실행
python manage.py test
# 특정 앱만 실행
python manage.py test myapp
# 특정 파링 실행
python manage.py test myapp.tests.test_models
# pytest 사용 시
pytest
GitHub - Koras02/djago-bloging: https://thinky.tistory.com/category/Back-End/Django
https://thinky.tistory.com/category/Back-End/Django - Koras02/djago-bloging
github.com
728x90
LIST
'Back-End > Django' 카테고리의 다른 글
[Django] 5장 정적 파일 및 미디어 파일 설정 (1) | 2025.08.11 |
---|---|
[Django] 4장. Django 템플릿 작성 - HTML 템플릿 작성 및 렌더링 (0) | 2025.08.07 |
[Django] 3장. Django 뷰 작성 - 비즈니스 로직 및 데이터 처리 (0) | 2025.04.04 |
[Django] 2장. Django 모델 정의, 어드민 설정 (0) | 2025.03.25 |
[Django] 1장. Django란? (0) | 2025.03.07 |