이번 프로젝트에서는 test코드를 꼭 작성해보고 싶어서 강의를 듣고 여러 시도를 해보았다. 우선 나는 다음과 같은 이유로 DRF test 코드를 알아보게 되었다.
DRF 공식문서를 참고하여 작성할 예정이지만 자세하게 하나하나 뜯어보기보다는 구현중심으로 풀어보려고 한다.
from rest_framework.test import APIClient, APITestCase
우선 DRF.test에 있는 APIClient, 와 APITestCase 를 내가 테스트 하고 싶은 곳에 불러와준다. ex) tests.py 파일이나 tests라는 이름을 가진 python폴더 내의 python파일
APIClient는 여러가지 기능을 가지는데 각종 http메소드도 보낼 수 있고 내장 로그인, 로그아웃 함수도 지원하고 있는듯 하다!
class TestMyPage(APITestCase):
def test_letter_num_is_not_added(self):
client = APIClient()
user = UserModel.objects.create(username="joo", password="1234", nickname="joo")
client.force_authenticate(user=user)
url = "/my_page/my_letter"
response = client.get(url)
self.assertEqual("올바른 편지 번호를 입력해주세요.", response.json()["detail"])
self.assertEqual(400, response.status_code)
우선 위와 같이 테스트 함수들을 묶어줄 APITestCase를 상속받는 클래스를 만들어준 후 테스트 함수를 만들어준다.
테스트 케이스를 작성하면서 제일 당황했던건 인증을 어떻게 받지? 였다. 우리 프로젝트는 simple_jwt를 통해 인증을 받는데 그럼 테스트 함수마다 로그인을 해주어야 하는가? 하는 생각에 빠졌었는데 공식문서를 들어가자마자 3초만에 해결되었다.
client = APIClient()
client.force_authenticate(user=user)
APIClient는 force_authenticate라는 함수를 제공하는데 이 함수 안에 내가 만든 더미 유저를 넣어주면 함수 이름 그대로 강제로 인증을 시켜준다.
또한 url을 작성해 APIClient의 get 메소드를 통해서 데이터를 받아오고 받아온 리스폰스를 다양한 방식으로 검증해볼 수 있었다.
아직 포스트에 대한 테스트 코드는 작성중이지만 나중을 위해서 client에는 강제로 csrf validation을 통과시켜주는 명령어도 있어서 그 명령어를 남겨놓고 오늘의 til을 마친다.
client = APIClient(enforce_csrf_checks=True)
출처 : DRF test에 관한 공식문서