1.테스트 코드 작성
문제점
일정이 바쁘다는 핑계로 미뤄둔 테스트 코드를 작성 해야함
시도해 본 것들
최초 작성 테스트 코드
def test_get_exhibition_category_list(self):
exhibitions = []
for _ in range(4):
exhibitions.append(
Exhibition.objects.create(**self.exhibition_data, user=self.user)
)
for _ in range(3):
exhibitions.append(
Exhibition.objects.create(
**self.exhibition_category_data, user=self.user
)
)
query_params = "?category=전시"
response = self.client.get(
path=reverse("exhibitions:exhibition") + query_params
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 3)
category에 선택되지 않는 카테고리와 선택되는 카테고리를 for문으로 각각 생성 후 확인하는 과정이지만 그리 마음에 드는 구조가 아님
class ExhibitionSearchViewTest(APITestCase):
@classmethod
def setUpTestData(cls):
cls.user = User.objects.create_superuser("search@test.com", "테스트", "1234")
cls.exhibition_search_data = {
"info_name": "검색 제목",
"content": "검색 내용",
"location": "검색 장소",
"category": "Test Category",
"start_date": str(datetime.today())[:10],
"end_date": str(datetime.today())[:10],
"svstatus": "접수중",
}
cls.exhibitions = []
for _ in range(5):
cls.exhibitions.append(
Exhibition.objects.create(
**cls.exhibition_search_data,
user=cls.user,
)
)
def test_exhibition_search(self):
query_params_info_name = "?search=제목"
query_params_location = "?search=장소"
query_params_content = "?search=내용"
response_info_name = self.client.get(
path=reverse("exhibitions:exhibition") + query_params_info_name
)
response_location = self.client.get(
path=reverse("exhibitions:exhibition") + query_params_location
)
response_content = self.client.get(
path=reverse("exhibitions:exhibition") + query_params_content
)
self.assertEqual(response_info_name.status_code, status.HTTP_200_OK)
self.assertEqual(response_info_name.data["count"], 5)
self.assertEqual(response_location.status_code, status.HTTP_200_OK)
self.assertEqual(response_location.data["count"], 5)
self.assertEqual(response_content.status_code, status.HTTP_200_OK)
self.assertEqual(response_content.data["count"], 5)
중복된 코드가 너무 많이보이면서 매우 마음에 들지 않았음
해결 방법
# ------------------------------------카테고리 적용 전시회(게시글) 리스트를 불러옴--------------------------------
def test_get_exhibition_category_list(self):
exhibitions = [
Exhibition.objects.create(**self.exhibition_data, user=self.user)
if i % 2 == 0
else Exhibition.objects.create(
**self.exhibition_category_data, user=self.user
)
for i in range(7)
]
query_params = "?category=전시"
response = self.client.get(
path=reverse("exhibitions:exhibition") + query_params
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 3)
exhibitions를 직접 호출하지는 않지만 알고리즘에서 자주 사용하던 list comprehension을 사용하여 list 선언 과정과 append()를 제거하고 각각 for문을 호출했던 부분을 홀짝으로 구분하여 하나로 통합하기
class ExhibitionSearchViewTest(APITestCase):
@classmethod
def setUpTestData(cls):
cls.user = User.objects.create_superuser("search@test.com", "테스트", "1234")
cls.exhibition_search_data = {
"info_name": "검색 제목",
"content": "검색 내용",
"location": "검색 장소",
"category": "Test Category",
"start_date": str(datetime.today())[:10],
"end_date": str(datetime.today())[:10],
"svstatus": "접수중",
}
cls.exhibitions = [
Exhibition.objects.create(
**cls.exhibition_search_data,
user=cls.user,
)
for _ in range(5)
]
cls.exhibition_data = {
"info_name": "Test Info_name",
"content": "Test Exhibition Content",
"location": "Test Location",
"category": "Test Category",
"start_date": str(datetime.today())[:10],
"end_date": str(datetime.today())[:10],
"svstatus": "접수중",
}
cls.exhibitions.append(
Exhibition.objects.create(**cls.exhibition_data, user=cls.user)
)
def test_exhibition_search(self):
query_params_list = ["?search=제목", "?search=장소", "?search=내용"]
for query_params in query_params_list:
response = self.client.get(
path=reverse("exhibitions:exhibition-search") + query_params
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 5)
중복 코드를 제거하는 과정에서 status_code가 200이 나오지만 내가 원하는 결과로 이어지고 있는게 아닌 것을 깨닫고 path수정과 데이터 추가, 그리고 반복문 제거까지 진행할 수 있었다.
알게 된 점
확실히 알고리즘 공부를 통해 다양한 사용법에 익숙해지면서 단순한 문제 풀이가 아닌 실제로 필요한 코드를 간결하고 효율적으로 구성할 수 있었다
예상 결과와 실제 값을 일치시키는 작업을 하는 것이 아닌 알고리즘에서 반례를 찾듯이 다양한 경우를 가지고 내가 작성한 코드가 어떤 경우에 제대로 작동하지 않을 수 있는가를 확인해보자
'프로젝트 > 미술관 뒤 백엔드 지금은 전시상황' 카테고리의 다른 글
최종 팀 프로젝트[발표] 최종 발표 (0) | 2023.07.10 |
---|---|
최종 팀 프로젝트[발표] 최종 발표 준비 (0) | 2023.07.05 |
최종 팀 프로젝트[front] pagination 추가 구현 (0) | 2023.07.03 |
최종 팀 프로젝트[back] openAPI image 이슈 (0) | 2023.06.30 |
최종 팀 프로젝트[front] netlify 배포 후 image 이슈 (0) | 2023.06.27 |