DRF로 test 코드 작성하기

코변·2022년 7월 20일
0

개발일지

목록 보기
40/41
post-thumbnail
post-custom-banner

이번 프로젝트에서는 test코드를 꼭 작성해보고 싶어서 강의를 듣고 여러 시도를 해보았다. 우선 나는 다음과 같은 이유로 DRF test 코드를 알아보게 되었다.

  1. 내가 작성한 서비스 코드들은 장고내장 테스트 기능으로 테스트가 가능하나 api 테스트 코드를 작성하려고 할 때 인증되지 않은 사용자라는 에러메시지가 계속해서 반환되었다.
  2. DRF를 통해서 api를 만들었고 사용하고 있는데 쓰라고 만들어둔 test를 안 써볼 이유가 없다.
  3. fake 인증이 굉장히 간편하다.

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에 관한 공식문서

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.
post-custom-banner

0개의 댓글