이제까지 나는 결과물을 보고 -> 수정하고 -> 다시 결과를 보고 -> 수정하고 의 과정을 반복하는 식의 웹개발을 해왔다. 그러나 장고에서는 이러한 번거로운 과정을 거치지 않고 테스트를 할 수 있도록 unittest
라는 모듈을 제공하고 있다.
테스트코드를 작성해야 하는 이유는 여러가지가 있지만, 내가 생각하는 가장 큰 이유는 아래 세 가지이다.
참고로 테스트하는 함수들은 내가 작성한 함수여야 한다. 파이썬이나 장고의 내장 패키지, 혹은 모듈을 테스트해볼 수는 없다.
장고에서 사용할 수 있는 테스트 툴로는 인터넷에 drf testing 이라고 치면 가장 먼저 나오는 drf test tool 이 있다. 파이썬의 unittest 와 pytest 를 기반으로 만든 장고 rest framework 의 테스트 툴이다.
APITestCase 를 이용하여 테스트할 것이다.
from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status
class UserRegistrationAPITestCase(APITestCase):
def testRegistation(self):
url = reverse("signup")
user_data = {"email": "dlg@daum.net", "password": "1029"}
response = self.client.post(url, user_data)
self.assertEqual(response.status_code, 201)
테스트 용도에 맞게 함수를 선언해준 뒤 url name 을 통해 url 설정을 해준 다음, serializer 에 들어가야 하는 데이터를 self.client 에 담아 post 로 전달한다. 이 뒤에 응답의 상태 코드가 view.py 에 설정해둔 상태 코드와 같으면 테스트가 잘 된 것이다.
테스트가 잘 실행된 것을 볼 수 있다.
다만 테스트들은 서로 독립적이어야 한다는 원칙에 따라 장고는 테스트 메서드가 끝난 후 db 를 초기화하기 때문에 같은 유저 정보로 로그인을 시도할 수는 없다.
그렇다면 로그인을 하기 위해서 로그인 함수를 같은 테스트 클래스 안에 넣어줘야 할까? 아니다. 이럴 때를 대비하여 장고에서는 setup 이라는 기능을 제공한다. 모든 테스트 메서드 이전에 실행시켜 테스트를 하기 위한 기본 요건을 갖춰주는 것이다.
이외에는 회원가입 테스트와 비슷하게 진행하면 된다.
class UserLogInTest(APITestCase):
def setUp(self):
self.data = {"email": "dlg@daum.net", "password": "1029"}
self.user = User.objects.create(self.data)
def LogIn(self):
url = reverse("token_obtain_pair")
response = self.client.post(url, self.data)
self.assertEqual(response.status_code, 200)
setUp() 으로 미리 같은 데이터의 유저를 생성해 준 뒤 테스트를 진행해주었다.
결과가 잘 나오는 것을 볼 수 있다.