■ 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)
반응형
'DEV > Web 개발' 카테고리의 다른 글
Web개발 :: github action을 활용한 CI/CD _TIL77 (0) | 2022.12.28 |
---|---|
Web개발 :: Pagination, Crawling, Localstorage _TIL76 (1) | 2022.12.20 |
Web 개발 :: 12월 셋째주 WIL16 (0) | 2022.12.19 |
Web개발 :: BackData 전처리, Json 파일 변환 등 _TIL74 (0) | 2022.12.19 |
Web개발 :: 데이터 처리, 변형, Pandas Dataframe, Pagenation _TIL72 (0) | 2022.12.15 |
댓글