[0711] DRF test.py 활용하기

nikevapormax·2022년 7월 11일
0

TIL

목록 보기
69/116
post-custom-banner

Django Rest Framework

기본적인 test code 작성

  • 프로젝트 폴더가 아닌 app 폴더 안에는 기본적으로 test.py가 생성된다.
  • 이 곳에 내가 테스트하고자 하는 코드를 입력한 후, 터미널에서 아래의 코드를 실행하게 되면 그 결과가 나오게 된다.
$ python manage.py test
  • 일단 test.py 파일에 아래의 코드를 입력해 보자.
from django.test import TestCase

class TestView(TestCase):
    def test_two_is_three(self):
        self.assertEqual(2, 3)
  • 그리고 위의 명령어를 터미널에 입력해 결과를 확인해보자.
    • 2와 3은 같지 않기 때문에 아래의 에러가 나는 것을 알 수 있다.
  • 반면 아래의 코드를 테스트하게 되면 성공 메세지가 나온다.
from django.test import TestCase

class TestView(TestCase):
    def test_two_is_two(self):
        self.assertEqual(2, 2)

test tool

  • 기본 python으로 만들어진 파일에 대한 테스팅은 아래의 문서를 확인해보면 된다.
    • python testing
    • python으로 작성된 파일을 테스팅하는 경우도 있기 때문에 익혀두면 좋다.
  • [공홈] DRF testing

DRF testing

회원가입 테스트

from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status

class UserRegistrationAPIViewTestCase(APITestCase):
    def test_registration(self):
        # user_view라는 name을 가진 url을 자동으로 가져와 변수에 저장해줌
        url = reverse("user_view")
        user_data = {
            "username" : "user10",
            "fullname" : "user10",
            "email" : "user10@naver.com",
            "password" : "1010"
        }
        
        # client는 APITestCase에서 자동으로 생성해준다.
        # client를 이용해서 post를 보내고, 아래의 url로 user_data를 보내주고 결과를 response에 담아준다.
        response = self.client.post(url, user_data)
        
        self.assertEqual(response.status_code, 200)
  • 위의 코드를 입력한 후, python manage.py test를 하게 되면 아래와 같이 성공 메세지를 볼 수 있다.

  • 이번에는 하나의 값을 일부러 빼서 결과를 확인해 보도록 하겠다.

from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status

class UserRegistrationAPIViewTestCase(APITestCase):
    def test_registration(self):
        # user_view라는 name을 가진 url을 자동으로 가져와 변수에 저장해줌
        url = reverse("user_view")
        user_data = {
            "username" : "user10",
            "fullname" : "user10",
             # "email" : "user10@naver.com",
            "password" : "1010"
        }
        
        # client는 APITestCase에서 자동으로 생성해준다.
        # client를 이용해서 post를 보내고, 아래의 url로 user_data를 보내주고 결과를 response에 담아준다.
        response = self.client.post(url, user_data)
        # 우리가 views.py의 회원가입 부분의 Response에 값을 담아놓았기 때문에 프린트를 찍으면 어디서 에러가 났는지 알 수 있음
        print(response.data)
        
        self.assertEqual(response.status_code, 200)
  • 아래 결과와 같이, 어떤 부분에서 에러가 났는지도 확인할 수 있다.
  • 위의 예시 말고도 Response에 실린 메세지를 확인할 수도 있고, 만약 Response에 내가 user의 데이터를 실어서 반환하고 있다면 그 반환값도 비교를 통해 코드가 올바르게 작성되었는지 알 수 있다. (더 많은 것들을 할 수 있다!)

로그인 테스트

class UserRegistrationTest(APITestCase):
	def test_registration(self):
        # user_view라는 name을 가진 url을 자동으로 가져와 변수에 저장해줌
        url = reverse("user_view")
        user_data = {
            "username" : "user10",
            "fullname" : "user10",
            "email" : "user10@naver.com",
            "password" : "1010"
        }
        
        # client는 APITestCase에서 자동으로 생성해준다.
        # client를 이용해서 post를 보내고, 아래의 url로 user_data를 보내주고 결과를 response에 담아준다.
        response = self.client.post(url, user_data)
        # 우리가 views.py의 회원가입 부분의 Response에 값을 담아놓았기 때문에 프린트를 찍으면 어디서 에러가 났는지 알 수 있음
        # print(response.data)
        
        self.assertEqual(response.status_code, 200)
        
    def test_login(self):
        url = reverse("token_obtain_pair")
        user_data = {
            "username" : "user10",
            "fullname" : "user10",
            "email" : "user10@naver.com",
            "password" : "1010"
        }

        response = self.client.post(url, user_data)
        print(response.data)
        
        self.assertEqual(response.status_code, 200)
  • 위와 같이 코드를 짜고 테스트를 해보도록 하자.
  • 그러면 아래의 결과가 나오게 된다.
  • 해당 코드에서 분명히 회원가입 테스트를 진행하고 로그인을 진행하였는데 401 에러가 나왔다.

401 에러의 이유

  • 이유는 모든 test method를 진행할 때 django는 test db를 생성하게 되는데, 해당 test method가 끝나는 순간 test db를 초기화하게 되어서 그렇다.
  • 또한 위와 같이 코드를 작성하게 되면, 어떤 것이 먼저 실행될 것인지에 대한 보장이 없다.
  • 따라서 테스트는 항상 unit test의 관점에서 작성해야 한다. 하나의 테스트가 다른 테스트에 의존해서는 안 된다. (stateless)
  • 만약 두 가지를 같이 하고 싶다면 아래와 같이 작성해주어야 한다.
class ExampleOfUnitTest(APITestCase):
	def test_A_the_B(self):
    	self.TestA()
        self.TestB()
        ...

setUp()

  • 하지만 회원가입 로그인은 괜찮을지라도, 나중에 게시글을 작성하게 될 때 아예 처음부터 다 해주어야 하는 상황이 발생할 수 있다.
  • 이렇게 진행할 필요가 없도록 setUp() method가 존재한다.
  • setUp()은 테스트 코드가 진행되게 전에 반드시 먼저 작성해주어야 한다.
  • 반대로 모든 것이 끝나고 나서 실행되는 함수는 tearDown()으로 작성해주면 된다.

setUp()을 활용한 로그인 테스트

class LoginUserTest(APITestCase):
    def setUp(self):
        self.data = {'username': 'user10', 'password': '1010'}
        self.user = User.objects.create_user('user10', '1010')
        
    def test_login(self):
        response = self.client.post(reverse('token_obtain_pair'), self.data)
        print(response.data["access"])
        self.assertEqual(response.status_code, 200 )
  • 위의 코드를 테스트해보면 아래의 결과가 나온다.
    • access 토큰의 값이 잘 나온 것을 확인할 수 있다.
  • 이렇게 테스트를 진행하면서 주의해야 할 점은 우리가 작성한 views.py 같은 파일에 한해서만 해야 한다는 것이다. django의 라이브러리나 내장 함수에 대해서 테스트를 하는 것이 아니다.
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글