🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Django 테스트 전략 완벽 가이드 - 슬라이드 1/11
A

AI Generated

2025. 11. 2. · 14 Views

Django 테스트 전략 완벽 가이드

Django 프로젝트의 품질을 보장하는 테스트 전략을 배워봅니다. 유닛 테스트부터 통합 테스트까지 실전 예제로 학습합니다.


카테고리:Python
언어:Python
메인 태그:#Django
서브 태그:
#TestCase#UnitTest#Integration#Fixtures

들어가며

이 글에서는 Django 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 기본_유닛_테스트
  2. 뷰_테스트하기
  3. Fixture_데이터_사용
  4. 폼_유효성_테스트
  5. API_엔드포인트_테스트
  6. 인증_테스트
  7. Mock_객체_활용
  8. 데이터베이스_쿼리_최적화_테스트
  9. 커스텀_매니저_테스트
  10. 시그널_테스트

1. 기본 유닛 테스트

개요

Django의 TestCase를 사용하여 모델의 기본 동작을 검증합니다. 데이터베이스 트랜잭션이 자동으로 롤백됩니다.

코드 예제

from django.test import TestCase
from .models import Post

class PostModelTest(TestCase):
    def test_post_creation(self):
        post = Post.objects.create(
            title="테스트", content="내용"
        )
        self.assertEqual(post.title, "테스트")

설명

TestCase 클래스를 상속받아 테스트를 작성하고, assertEqual로 예상값과 실제값을 비교합니다.


2. 뷰 테스트하기

개요

Client 객체를 사용하여 HTTP 요청을 시뮬레이션하고 응답을 검증합니다. 실제 서버 없이 테스트 가능합니다.

코드 예제

from django.test import TestCase, Client

class ViewTest(TestCase):
    def setUp(self):
        self.client = Client()

    def test_home_page(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

설명

setUp 메서드로 테스트 환경을 준비하고, get 메서드로 페이지 응답 상태를 확인합니다.


3. Fixture 데이터 사용

개요

테스트에 필요한 초기 데이터를 fixtures로 관리하여 재사용성을 높입니다. JSON 파일로 저장됩니다.

코드 예제

from django.test import TestCase

class PostTestWithFixture(TestCase):
    fixtures = ['posts.json']

    def test_post_count(self):
        from .models import Post
        self.assertEqual(Post.objects.count(), 5)

설명

fixtures 속성에 JSON 파일을 지정하면 테스트 실행 전 자동으로 데이터가 로드됩니다.


4. 폼 유효성 테스트

개요

폼의 유효성 검증 로직을 테스트하여 잘못된 데이터 입력을 방지합니다. 각 필드별 검증이 가능합니다.

코드 예제

from django.test import TestCase
from .forms import PostForm

class FormTest(TestCase):
    def test_valid_form(self):
        form = PostForm(data={
            'title': '제목', 'content': '내용'
        })
        self.assertTrue(form.is_valid())

설명

폼에 데이터를 전달하고 is_valid() 메서드로 유효성을 검증합니다.


5. API 엔드포인트 테스트

개요

REST API의 응답 데이터와 상태 코드를 검증합니다. JSON 응답의 구조도 확인할 수 있습니다.

코드 예제

from django.test import TestCase
from rest_framework.test import APIClient

class APITest(TestCase):
    def test_api_list(self):
        client = APIClient()
        response = client.get('/api/posts/')
        self.assertEqual(response.status_code, 200)

설명

DRF의 APIClient를 사용하여 API 엔드포인트를 테스트하고 응답을 검증합니다.


6. 인증 테스트

개요

로그인이 필요한 페이지의 접근 권한을 테스트합니다. 인증된 사용자와 비인증 사용자를 구분합니다.

코드 예제

from django.test import TestCase
from django.contrib.auth.models import User

class AuthTest(TestCase):
    def test_login_required(self):
        user = User.objects.create_user('test', password='1234')
        self.client.login(username='test', password='1234')
        response = self.client.get('/profile/')
        self.assertEqual(response.status_code, 200)

설명

create_user로 테스트 유저를 생성하고 login 메서드로 인증 상태를 시뮬레이션합니다.


7. Mock 객체 활용

개요

외부 API나 복잡한 의존성을 Mock으로 대체하여 격리된 테스트를 수행합니다. 실제 호출 없이 테스트 가능합니다.

코드 예제

from django.test import TestCase
from unittest.mock import patch

class MockTest(TestCase):
    @patch('requests.get')
    def test_external_api(self, mock_get):
        mock_get.return_value.status_code = 200
        # 외부 API 호출 테스트
        self.assertEqual(mock_get.return_value.status_code, 200)

설명

@patch 데코레이터로 외부 의존성을 Mock으로 대체하고 예상 동작을 정의합니다.


8. 데이터베이스 쿼리 최적화 테스트

개요

쿼리 횟수를 측정하여 N+1 문제를 방지합니다. assertNumQueries로 정확한 쿼리 수를 검증합니다.

코드 예제

from django.test import TestCase

class QueryTest(TestCase):
    def test_query_count(self):
        from .models import Post
        with self.assertNumQueries(1):
            posts = list(Post.objects.all())

설명

assertNumQueries 컨텍스트 매니저로 예상 쿼리 수를 지정하고 실제 실행된 쿼리 수를 비교합니다.


9. 커스텀 매니저 테스트

개요

모델의 커스텀 매니저 메서드가 올바르게 작동하는지 검증합니다. 복잡한 쿼리 로직을 테스트합니다.

코드 예제

from django.test import TestCase
from .models import Post

class ManagerTest(TestCase):
    def test_published_posts(self):
        Post.objects.create(title="게시", published=True)
        Post.objects.create(title="비공개", published=False)
        self.assertEqual(Post.objects.published().count(), 1)

설명

커스텀 매니저의 published() 메서드가 공개된 게시물만 반환하는지 확인합니다.


10. 시그널 테스트

개요

Django 시그널이 올바른 시점에 발생하는지 테스트합니다. 모델 저장 시 자동 실행되는 로직을 검증합니다.

코드 예제

from django.test import TestCase
from django.db.models.signals import post_save

class SignalTest(TestCase):
    def test_post_save_signal(self):
        from .models import Post
        with self.captureOnCommitCallbacks(execute=True):
            post = Post.objects.create(title="테스트")
            self.assertTrue(post.slug)

설명

post_save 시그널이 실행되어 자동으로 slug가 생성되는지 확인합니다. --- Django 테스트 전략 카드 뉴스가 완성되었습니다. 초급 개발자도 쉽게 따라할 수 있도록 실용적인 예제 중심으로 구성했습니다.


마치며

이번 글에서는 Django 테스트 전략 완벽 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#Django #TestCase #UnitTest #Integration #Fixtures

#Django#TestCase#UnitTest#Integration#Fixtures#Python

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.