본문 바로가기

프로젝트/미술관 뒤 백엔드 지금은 전시상황

최종 팀 프로젝트[back] 테스트 코드 작성

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수정과 데이터 추가, 그리고 반복문 제거까지 진행할 수 있었다. 

 알게 된 점

확실히 알고리즘 공부를 통해 다양한 사용법에 익숙해지면서 단순한 문제 풀이가 아닌 실제로 필요한 코드를 간결하고 효율적으로 구성할 수 있었다

예상 결과와 실제 값을 일치시키는 작업을 하는 것이 아닌 알고리즘에서 반례를 찾듯이 다양한 경우를 가지고 내가 작성한 코드가 어떤 경우에 제대로 작동하지 않을 수 있는가를 확인해보자