ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] API test | API 잘 작동하는지 테스트하기
    파이썬/Django 2023. 1. 23. 23:27
    728x90
    반응형

     django에는 기본적으로 테스트케이스 라이브러리가 존재한다.

    from django.test import TestCase

    하지만 drf에도 test case class가 있기 때문에 그것을 사용할 것이다. 단축기능이 많고 더 편리하다.

     

    AmenityDetail 클래스 test하기

     

    📁 rooms/views.py

    class AmenityDetail(APIView):
        def get_object(self, pk):
            try:
                return Amenity.objects.get(pk=pk)
            except Amenity.DoesNotExist:
                raise NotFound
            
        def get(self, request, pk):
            amenity = self.get_object(pk)
            serializer = serializers.AmenitySerializer(amenity)
            return Response(serializer.data)
    
        def put(self, request, pk):
            amenity = self.get_object(pk)
            serializer = serializers.AmenitySerializer(
                amenity,
                data=request.data,
                partial=True,
            )
            if serializer.is_valid():
                updated_amenity = serializer.save()
                return Response(
                    serializers.AmenitySerializer(updated_amenity).data,
                )
            else:
                return Response(
                    serializer.errors,
                    status=HTTP_400_BAD_REQUEST,
                )
        
        def delete(self, request, pk):
            amenity = self.get_object(pk)
            amenity.delete()
            return Response(status=HTTP_204_NO_CONTENT)

    AmenityDetail 클래스에는 get, put, delete request가 있다.

    test할 때도 세 request를 만들어서 테스트해야 함

     

    📁 rooms/tests.py

    class TestAmenity(APITestCase):
    
        NAME = "Test Amenity"
        DESC = "Test Dsc"
    
        # 어메니티 하나의 객체 생성
        def setUp(self):
            models.Amenity.objects.create(
                name=self.NAME,
                description=self.DESC,
            )
    
        def test_amenity_not_found(self):
            response = self.client.get("/api/v1/rooms/amenities/2") 
            # pk가 2인 어메니티는 아직 존재하지 않음
            self.assertEqual(response.status_code, 404)
            #따라서 이 test는 404가 나옴
            
        # GET
        def test_get_amenity(self):
            response = self.client.get("/api/v1/rooms/amenities/1")
    
            # 어메니티 정보를 올바르게 가져온 경우
            self.assertEqual(response.status_code, 200)
    
            # data에 json 형태로 넣어준다
            data = response.json()
    
            # data의 name과 현재 name이 같은지 확인
            self.assertEqual(
                data["name"],
                self.NAME,
            )
            self.assertEqual(
                data["description"],
                self.DESC,
            )
    
        # PUT
        def test_put_amenity(self):
            put_amenity_name = "new amenity name"
            put_amenity_desc = "new amenity description"
            response = self.client.put(
                "/api/v1/rooms/amenities/1",
                data={
                    "name":put_amenity_name,
                    "description":put_amenity_desc,
                }
            )
            
            data = response.json()
            # print(data)
            
            self.assertEqual(
                response.status_code, 200,
                "Not 200 status code"
            )
            
            self.assertEqual(
                data["name"],
                put_amenity_name,
            )
            
            self.assertEqual(
                data["description"],
                put_amenity_desc,
            )
    
        # DELETE
        def test_delete_amenity(self):
    
            response = self.client.delete("/api/v1/rooms/amenities/1")
    
            self.assertEqual(response.status_code, 204)

    각각 get, put, delete를 테스트하는 함수를 만들어서 잘 작동하는지 확인할 수 있다.

     

     

    LIST
Designed by Tistory.