DJango 서버개발, 단위 테스트 및 통합 테스트 작성하기

Django는 파이썬으로 작성된 웹 프레임워크로, 개발자들이 쉽고 빠르게 웹 애플리케이션을 구축할 수 있도록 돕습니다. 이 문서에서는 Django를 사용하여 서버를 개발하고, 애플리케이션의 다양한 기능을 검증하기 위한 단위 테스트 및 통합 테스트를 작성하는 방법에 대해 설명하겠습니다.

1. Django 프로젝트 설정

먼저 Django 프로젝트를 시작하기 위해, Django를 설치하고 새로운 프로젝트를 생성합니다. 아래의 명령어를 사용하여 Django를 설치할 수 있습니다.

pip install Django

설치가 완료되면, 아래의 명령어로 새로운 Django 프로젝트를 생성합니다.

django-admin startproject myproject

이제 프로젝트 디렉토리로 이동해 서버를 실행해 보겠습니다.

cd myproject
python manage.py runserver

브라우저에서 http://127.0.0.1:8000/를 입력하면 Django의 기본 환영 페이지를 볼 수 있습니다.

2. Django 모델 생성

단위 테스트와 통합 테스트를 작성하기 위해, 간단한 모델을 생성해보겠습니다. myapp라는 새로운 앱을 생성한 후, 간단한 게시글 모델을 추가하겠습니다.

python manage.py startapp myapp

생성된 myapp/models.py 파일을 열어 모델을 추가합니다.

# myapp/models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

모델을 생성한 후, 데이터베이스에 적용하기 위해 마이그레이션을 수행합니다.

python manage.py makemigrations myapp
python manage.py migrate

3. 단위 테스트 작성하기

이제 모델의 단위 테스트를 작성해 보겠습니다. tests.py 파일을 열어 아래의 코드를 추가합니다.

# myapp/tests.py

from django.test import TestCase
from .models import Post

class PostModelTest(TestCase):

    def setUp(self):
        Post.objects.create(title="첫 번째 게시글", content="게시글 내용입니다.")

    def test_post_content(self):
        post = Post.objects.get(id=1)
        expected_object_name = f'{post.title}'
        self.assertEqual(expected_object_name, "첫 번째 게시글")

    def test_post_content_length(self):
        post = Post.objects.get(id=1)
        self.assertTrue(len(post.content) > 0)

테스트를 수행하기 위해 아래 명령어를 사용합니다.

python manage.py test myapp

위의 명령어를 실행하면, 작성한 테스트가 실행되고 성공 여부를 확인할 수 있습니다.

4. 통합 테스트 작성하기

통합 테스트는 여러 컴포넌트가 함께 작동하는지를 검증합니다. 예를 들어, 게시글을 생성하고, 해당 게시글이 실제로 데이터베이스에 저장되었는지를 확인하는 테스트를 작성할 수 있습니다.

# myapp/tests.py (수정)

from django.urls import reverse

class PostViewTest(TestCase):

    def setUp(self):
        Post.objects.create(title="첫 번째 게시글", content="게시글 내용입니다.")

    def test_post_list_view(self):
        response = self.client.get(reverse('post_list'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "첫 번째 게시글")
        self.assertTemplateUsed(response, 'myapp/post_list.html')

위 테스트는 게시글 리스트 뷰에 대한 테스트입니다. 실제 페이지에 접속하여 올바른 HTTP 상태 코드가 응답되고, 올바른 템플릿이 사용되었는지를 검증합니다.

5. 테스트 실행 및 결과 확인

테스트를 통합하여 실행하려면 아래 명령어를 사용합니다.

python manage.py test

이 명령어를 통해 모든 앱의 테스트가 실행되며, 성공 또는 실패에 대한 결과가 출력됩니다. 각 테스트 케이스가 통과하지 못할 경우, 에러 메시지도 함께 제공되어 어디서 문제가 발생했는지 쉽게 확인할 수 있습니다.

6. Django REST Framework와 통합테스트

Django REST Framework를 사용하여 API를 구축하고, API에 대한 테스트를 작성할 수도 있습니다. 아래는 간단한 API를 위한 뷰와 그에 대한 테스트 예제입니다.

# myapp/views.py

from rest_framework import generics
from .models import Post
from .serializers import PostSerializer

class PostListCreate(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

# myapp/serializers.py

from rest_framework import serializers

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'created_at']

API가 제대로 작동하는지 테스트하기 위해 아래와 같은 통합 테스트를 작성할 수 있습니다.

# myapp/tests.py (수정)

from rest_framework import status
from rest_framework.test import APITestCase

class PostAPITest(APITestCase):

    def test_create_post(self):
        url = reverse('post-list-create')
        data = {'title': '테스트 게시글', 'content': '테스트 내용입니다.'}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(Post.objects.count(), 1)
        self.assertEqual(Post.objects.get().title, '테스트 게시글')

7. 결론

Django에서 단위 테스트와 통합 테스트는 애플리케이션의 품질을 보장하는 데 매우 중요한 역할을 합니다. 본 문서에서는 기본적인 Django 서버 개발과 테스트 작성 방법에 대해 알아보았습니다. 실제 애플리케이션 개발 시, 이러한 테스트를 통해 코드의 변경이나 기능 추가로 인한 오류를 사전에 방지할 수 있으며, 더 나은 사용자 경험을 제공할 수 있습니다.

이제 여러분이 Django의 단위 테스트와 통합 테스트를 작성하여 애플리케이션을 더욱 견고하게 만들 수 있기를 바랍니다.