-
[Django] API test | API 잘 작동하는지 테스트하기파이썬/Django 2023. 1. 23. 23:27728x90반응형
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'파이썬 > Django' 카테고리의 다른 글
[Django] Python 중 "@@@ could not be resolved" 에러 해결 방법 _Mac (0) 2023.03.05 [Django] Swagger를 통한 API 문서 작성하기 with. Django (1) 2023.01.29 [Django] 인증 Authentication (0) 2023.01.23 [Django] user api (get, put) 만들기 (0) 2023.01.17 [Django] Permission_classes 사용하여 인증하기 (feat.DRF) (0) 2023.01.16