Django는 웹 애플리케이션을 개발할 때 중요한 부분 중 하나인 테스트를 매우 잘 지원합니다. 테스트를 작성함으로써 코드의 안정성을 높이고, 예상치 못한 버그를 방지할 수 있습니다.


TestCase

Django는 내장된 unittest 프레임워크를 사용하여 테스트를 작성하고 실행할 수 있게 지원합니다. Django 프로젝트에서 테스트는 tests.py 파일에 작성됩니다. 기본적으로 tests.py는 Django 애플리케이션 디렉토리 내에 위치하며, 여기에 테스트 케이스를 작성합니다.

# tests.py

from django.test import TestCase
from .models import MyModel

class MyModelTestCase(TestCase):
    def setUp(self):
        # 데이터 모델 생성
        self.obj = MyModel.objects.create(name='Test')

    def test_model_creation(self):
        # 모델 객체가 제대로 생성되었는지 확인
        self.assertEqual(self.obj.name, 'Test')
python manage.py test

# Found 1 test(s).
# Creating test database for alias 'default'...
# System check identified no issues (0 silenced).
# .
# ----------------------------------------------------------------------
# Ran 1 test in 0.001s
# 
# OK
# Destroying test database for alias 'default'...

Django는 TestCase 클래스를 제공하여 데이터베이스의 변경 사항을 테스트 환경에서 안전하게 처리할 수 있습니다. TestCase는 여러 테스트 메서드(test_로 시작하는 메서드)로 구성되며, 각 테스트 메서드는 독립적으로 실행됩니다.

  • setUp(): 각 테스트 전에 실행되는 메서드로, 테스트에 필요한 데이터를 준비하는 역할을 합니다.
  • tearDown(): 각 테스트 후 실행되는 메서드로, 리소스를 정리하거나 초기화하는 데 사용됩니다.
  • assertEqual(), assertTrue() 등의 다양한 검증 메서드를 사용하여 테스트 결과를 확인합니다.

Model

모델 테스트는 Django에서 데이터베이스의 데이터가 예상대로 처리되는지 확인하는 중요한 부분입니다. 모델을 테스트할 때는 객체 생성, 필드 값 검증, 데이터베이스 저장 등을 검증할 수 있습니다.

# tests.py

from django.test import TestCase
from .models import Product

class ProductTestCase(TestCase):
    def setUp(self):
        self.product = Product.objects.create(name='Laptop', price=1000)

    def test_product_creation(self):
        self.assertEqual(self.product.name, 'Laptop')
        self.assertEqual(self.product.price, 1000)
    
    def test_product_discount(self):
        self.product.apply_discount(10)
        self.assertEqual(self.product.price, 900)

위 예시에서는 Product 모델에 대한 테스트를 작성합니다. test_product_creation() 메서드는 객체가 잘 생성되는지 확인하고, test_product_discount()는 할인 적용 로직을 검증합니다.

View

뷰 테스트는 주로 HTTP 응답 상태 코드, 템플릿 렌더링, 컨텍스트 데이터 등을 확인하는 데 사용됩니다. Django에서는 Client 객체를 사용하여 실제 HTTP 요청을 보내고, 이에 대한 응답을 확인할 수 있습니다.

# tests.py

from django.test import TestCase
from django.urls import reverse

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

    def test_view_template(self):
        response = self.client.get(reverse('my_view'))
        self.assertTemplateUsed(response, 'my_template.html')

    def test_view_context(self):
        response = self.client.get(reverse('my_view'))
        self.assertIn('some_variable', response.context)

위 예시에서는 뷰 테스트를 수행합니다. self.client.get()을 사용하여 HTTP GET 요청을 보내고, 응답의 상태 코드, 템플릿, 컨텍스트를 검증합니다.


APITestCase

Django REST Framework에서는 API 테스트를 작성할 때, APIClient를 사용하여 실제 HTTP 요청을 보내고 응답을 확인할 수 있습니다. 이는 API의 동작을 검증하는 중요한 과정입니다.

# tests.py

from rest_framework.test import APITestCase
from rest_framework import status
from .models import MyModel

class MyModelAPITestCase(APITestCase):
    def setUp(self):
        self.obj = MyModel.objects.create(name='Test')

    def test_model_api(self):
        url = f'/api/mymodel/{self.obj.id}/'
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['name'], 'Test')

위 예시에서는 APITestCase를 사용하여 REST API의 동작을 테스트합니다. self.client.get()을 통해 API에 GET 요청을 보내고, 응답 코드와 데이터를 검증합니다.


References