본문 바로가기
DEV/Web 개발

Web개발 :: 데이터 전처리, Django TestCode 작성 _TIL75

by 올커 2022. 12. 20.

■ JITHub 개발일지 75일차

□  TIL(Today I Learned) ::

데이터 전처리, Django TestCode 작성

  - place 앱에 대한 테스트 코드를 작성하고 있다.

  - 테스트 코드는 사실 프로젝트를 진행하면서 동시에 작성하여 하나하나 테스트하고 넘어가야 하는 부분이지만 이번 프로젝트 때에는 그렇게 하지 못하여 중간 배포까지 진도를 빼고 팀원들과 하나하나 채워나가기로 했다.

  - 아래는 팀원이 작성한 Review 앱의 코드이다. 본 코드를 이해하고 place앱에 적용하려 하는데, 사실

    1) 테스트해보아야 할 케이스에 대한 정의가 우선되어야 할 것 같고,

    2) 사용자 로그인 상태에 따라 setUp이 달라져야 하는데 어떻게 해야 할지 감이 잘 오지 않았다.

  - 일단 지금은 코드를 뚫어져라 보고 있다..

from django.urls import reverse
from rest_framework.test import APITestCase
from users.models import User, Profile
from reviews.models import Review, Comment, Recomment, Report
from places.models import Place

# 이미지 업로드
from django.test.client import MULTIPART_CONTENT, encode_multipart, BOUNDARY
from PIL import Image
import tempfile

def get_temporary_image(temp_file):
    size = (200,200)
    color = (255, 0, 0, 0)
    image = Image.new("RGBA", size, color)
    image.save(temp_file, 'png')
    return temp_file

#### 리뷰 ####
# 전체 리뷰 조회
class ReviewRankAPIViewTest(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {'username':'test1234', 'password':'Test1234!'}
        cls.user = User.objects.create_user("test1234","test@test.com", "01012341234","Test1234!")
        Profile.objects.create(user=cls.user)
        cls.place = Place.objects.create(place_name="장소명", category="카테고리", rating="5", place_address="주소", place_time="시간", place_img="이미지")

    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair_view'), self.user_data).data['access']
    
    # 전체 리뷰 조회 성공
    def test_review_rank_list_success(self):  
        response = self.client.get(
            path=reverse("reveiw_rank_view"),
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}")
        self.assertEqual(response.status_code, 200)

# 리뷰 조회/작성
class ReviewAPIViewTest(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {'username':'test1234', 'password':'Test1234!'}
        cls.review_data = {'content':'some content', "rating_cnt": "5"}
        cls.user = User.objects.create_user("test1234","test@test.com", "01012341234","Test1234!")
        Profile.objects.create(user=cls.user)
        cls.place = Place.objects.create(place_name="장소명", category="카테고리", rating="5", place_address="주소", place_time="시간", place_img="이미지")

    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair_view'), self.user_data).data['access']
    
    # 해당 장소 리뷰 조회 성공
    def test_review_list_success(self):  
        response = self.client.get(
            path=reverse("review_list_view", kwargs={'place_id':1}),
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}")
        self.assertEqual(response.status_code, 200)

    #리뷰 작성 성공
    def test_review_create_success(self):  
        response = self.client.post(
            path=reverse("review_list_view", kwargs={'place_id':1}),
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}",
            data=self.review_data)
        self.assertEqual(response.status_code, 201)

    # 이미지 포함 리뷰 작성 성공
    def test_create_review_with_image(self):
        # 첫번째 이미지
        # 임시 이미지 파일 생성
        temp_file = tempfile.NamedTemporaryFile()
        temp_file.name = "image.png"
        image_file = get_temporary_image(temp_file)
        image_file.seek(0)  # 첫번째 프레임을 받아옴
        self.review_data["review_image_one"] = image_file
        # 두번째 이미지
        temp_file = tempfile.NamedTemporaryFile()
        temp_file.name = "image.png"
        image_file = get_temporary_image(temp_file)
        image_file.seek(0)  
        self.review_data["review_image_two"] = image_file
        # 세번째 이미지
        temp_file = tempfile.NamedTemporaryFile()
        temp_file.name = "image.png"
        image_file = get_temporary_image(temp_file)
        image_file.seek(0) 
        self.review_data["review_image_three"] = image_file

        # 전송
        response = self.client.post(
            path=reverse("review_list_view", kwargs={'place_id':1}),
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}",
            content_type=MULTIPART_CONTENT,
            data=encode_multipart(data = self.review_data, boundary=BOUNDARY)
        )
        self.assertEqual(response.status_code, 201)

    # 로그인 안된 유저가 시도했을때 에러
    def test_fail_if_not_logged_in_review_post(self):
        response = self.client.post(
            path=reverse("review_list_view", kwargs={'place_id':1}), 
            data=self.review_data)
        self.assertEqual(response.status_code, 401)
    
    # 리뷰 작성 실패(리뷰내용이 빈칸)
    def test_review_create_content_fail(self):  
        response = self.client.post(
            path=reverse("review_list_view", kwargs={'place_id':1}),
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}",
            data= {'content':'', "rating_cnt": "4"})
        self.assertEqual(response.status_code, 400)

    # 리뷰 작성 실패(리뷰평점이 빈칸)
    def test_review_create_rating_fail(self):  
        response = self.client.post(
            path=reverse("review_list_view", kwargs={'place_id':1}),
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}",
            data= {'content':'some content', "rating_cnt": ""})
        self.assertEqual(response.status_code, 400)

 

 

반응형

댓글