자바스크립트를 허용해주세요.
[ 자바스크립트 활성화 방법 ]
from Mohon Aktifkan Javascript!
 

[Django] 6장 테스트 작성

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