카테고리 없음

tests.py

rlarudals 2025. 3. 15. 03:14

DRF Test.py 공식문서

https://www.django-rest-framework.org/api-guide/testing/

 

Testing - Django REST framework

 

www.django-rest-framework.org

 

class SignupTest(APITestCase):
    def test_create_user(self):
        """
        user signup testcode
        """
        url = reverse('accounts:signup')
        data = {
                "username" : "tests",
                "password" : "tests1234@",
                "nickname" : "tests",
                "email" : "tests@naver.com"
            }
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(CustomUser.objects.count(), 1)

        # 생성된 객체가 올바르게 저장되었는지 확인
        self.assertEqual(CustomUser.objects.get().username, 'tests')
       
        # 성공했을 경우 username 디버깅
        if CustomUser.objects.count() > 0:
            user = CustomUser.objects.first()
            print("성공 :", user.username)
app_name = 'accounts'

urls.py 에 위의 경우처럼 app_name 을 지정할 경우 reverse 부분에 app name을  써준다.

lass SigninTest(APITestCase):
    def setUp(self):
        """ 테스트 실행 전에 사용자 생성 """

        self.user = CustomUser.objects.create_user(
            username="tests",
            email="tests@naver.com",
            nickname="tests",
            password="tests1234@"
        )

        """access token 생성"""
        url = reverse('accounts:token_obtain_pair')
        data = {
                "email" : "tests@naver.com",
                "password" : "tests1234@"
            }
        response = self.client.post(url, data, format='json')

        self.access_token = response.data.get("access")

    def test_signin(self):
        """
        로그인 되는지 확인용 함수
        """
        url = reverse('accounts:token_obtain_pair')
        data = {
                "email" : "tests@naver.com",
                "password" : "tests1234@"
            }
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(CustomUser.objects.count(), 1)
        self.assertEqual(CustomUser.objects.get().email, 'tests@naver.com')

        # access token 확인용 디버그
        self.assertIn("access", response.data)
        print("로그인 성공, jwt token:", response.data["access"])

        # 성공했을 경우 email 디버깅
        if CustomUser.objects.count() > 0:
            user = CustomUser.objects.first()
            print("로그인성공 :", user.email)

   
    def test_get_user(self):
        """
        마이 페이지 관련 테스트
        """
        url = reverse('accounts:myprofile', kwargs={'nickname': self.user.nickname})
        self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {self.access_token}')

        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["nickname"], "tests")

        # 성공했을 경우 username 디버깅
        print("마이페이지 username", response.data['username'])

setup() 은 테스트코드에서 함수가 실행될때마다 초기화되서 다시 실행하는 중요한 함수
이 함수가 없을경우 일일이 테스트코드에 같은 데이터들을 넣어줘야함
setup() 실행순서는 위치 상관 없이 언제나 가장 먼저 실행됨

성공시 출력예제

assertEqual()은 두 값이 정확히 같은지 확인하는 메서드

def test_example(self):
    result = 10 + 5
    self.assertEqual(result, 15)

    """ 테스트 결과 : OK """
    """ if result == 14: //// 테스트 결과 : ERROR """

 

assertIn()은 특정 값이 리스트, 딕셔너리, 문자열 등에 포함되어 있는지 확인할 때 사용

def test_example(self):
    fruits = ["apple", "banana", "cherry"]
    self.assertIn("banana", fruits)

    """ if banana in fruits:
        테스트 결과 : OK """

    """ if banana not in fruits
        테스트 결과 : ERROR """