💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    11 포스트 생성 API 유닛 테스트 (POST 요청) | ✅ 편저: 코담 운영자

    11강 - 포스트 생성 API 유닛 테스트 (POST 요청)

    테스트 - 포스트 생성 API, POST 요청


    ✨ 이번 강의 목표

    • 로그인 상태에서 POST 요청으로 게시물이 정상 생성되는지 테스트
    • 인증되지 않은 사용자가 POST 요청 시 어떻게 처리되는지 확인
    • 테스트를 위한 이미지 파일 업로드 처리법 학습 (SimpleUploadedFile)

    1. 테스트 개요 및 목표

    POST 요청은 실제 데이터를 서버에 저장하는 동작입니다. 이번 테스트의 핵심은 다음과 같습니다:

    1. 로그인 상태의 사용자 → 이미지, 글 작성 후 정상 저장 여부 확인
    2. 비로그인 사용자 → 요청 시 로그인 페이지로 리디렉트 또는 지정된 뷰로 이동
    3. 업로드된 이미지와 텍스트가 Post 모델에 잘 저장되는지 검증

    2. 테스트 코드 (사용자 기준)

    tests/views/test_post_create.py

    from django.core.files.uploadedfile import SimpleUploadedFile
    from django.contrib.auth import get_user_model
    from django.urls import reverse
    from django.test import TestCase
    
    class TestPosts(TestCase):
        """
        게시글(Post) 관련 기능 테스트
        """
    
        def setUp(self):
            """
            테스트 실행 전 초기 설정.
            테스트용 유저 생성.
            """
            User = get_user_model()
            self.user = User.objects.create_user(
                username='testuser',
                email='testuser@example.com',
                password='testpassword'
            )
    
        def test_get_posts_page(self):
            """
            게시글 작성 페이지 접근 테스트 (GET 요청)
            """
            url = reverse('posts:post_create')
            response = self.client.get(url)
            self.assertEqual(response.status_code, 200)
            self.assertTemplateUsed(response, 'posts/post_create.html')
    
        def test_post_creating_posts(self):
            """
            로그인한 상태에서 게시글 작성 POST 요청을 테스트합니다.
            - 로그인 성공 여부 확인
            - POST 요청 성공 여부 및 올바른 템플릿 사용 확인
            """
            login = self.client.login(username="testuser", password="testpassword")
            self.assertTrue(login)
    
            url = reverse('posts:post_create')
            image = SimpleUploadedFile("test.jpg", b"whatevercontents")
    
            response = self.client.post(url, {
                'image': image,
                'caption': "test test"
            })
    
            self.assertEqual(response.status_code, 200)
            self.assertTemplateUsed(response, "posts/base.html")
    
        def test_post_creat_not_login(self):
            """
            비로그인 상태에서 게시글 작성 시 리디렉션 테스트
            """
            url = reverse('posts:post_create')
            image = SimpleUploadedFile("test.jpg", b"whatevercontents", content_type="image/jpeg")
    
            response = self.client.post(url, {
                'image': image,
                'caption': "test test"
            })
    
            self.assertEqual(response.status_code, 200)
            self.assertTemplateUsed(response, "users/main.html")
    

    3. 테스트 설명

    • setUp(): 테스트 실행 전 공통 유저를 생성합니다. 이 유저로 로그인하거나 테스트를 수행합니다.
    • reverse(): URL을 직접 문자열로 작성하는 대신 URL 이름을 기반으로 안전하게 가져옵니다.
    • SimpleUploadedFile(): 실제 이미지를 올리지 않고도 테스트를 위한 가상 이미지 파일 객체를 생성합니다.
    • self.client.post(...): 클라이언트를 통해 POST 요청을 전송하고 결과를 확인합니다.
    • assertEqual(): 응답 상태 코드가 예상 값과 같은지 확인합니다.
    • assertTemplateUsed(): 응답이 어떤 템플릿을 사용했는지 확인합니다.

    테스트 흐름

    테스트 함수 목적
    test_get_posts_page 로그인 없이 GET 요청 시 작성 페이지 반환 확인
    test_post_creating_posts 로그인 후 POST 요청 처리 및 템플릿 확인
    test_post_creat_not_login 비로그인 POST 요청 시 응답 코드와 템플릿 확인

    실제 프로젝트에서는 POST 요청 후 리디렉션(302)이 이뤄지는 경우도 있으며, 이는 로그인 장치와 설정에 따라 달라질 수 있습니다.


    4. 주요 개념 정리

    • ``: 테스트 전마다 실행되는 초기 설정 함수
    • ``: URL 네임을 통해 URL 문자열을 가져옴
    • ``: 이미지/파일 없이 업로드 시뮬레이션 가능
    • ``: 실제 POST 요청 테스트
    • ``: 결과 상태 코드 및 데이터 비교
    • ``: 응답에서 어떤 템플릿을 사용했는지 확인

    ✅ 정리

    • 로그인한 사용자가 POST 요청으로 게시글을 성공적으로 생성하는지 테스트
    • 비로그인 사용자가 접근했을 때의 처리 흐름 확인
    • 파일 업로드와 템플릿 사용 여부까지 전반적인 유닛 테스트 커버

    👉 다음 강의에서는 업로드된 이미지가 실제로 피드에 렌더링되고 출력되는 기능을 다룹니다.

    TOP
    preload preload