본문 바로가기

TIL 및 WIL/TIL (Today I Learned)

[TIL] 2022.07.27 (TestCode 작성, My Little Trip(9))

Backend API 구현을 마치고 DRF 내에서 해당 API가 정상적으로 작동하는지에 대한 TestCode를 작성해보았다.

 

이미 API 구현을 마치고 Postman을 통해 API가 정상적으로 작동하는지 확인을 했지만, 이번에는 Django내에 있는 tests.py 파일 안에서 직접 테스트 코드를 작성하고 테스트를 해보았다.

 

우선 맡은 파트인 좋아요(Like) 기능을 테스트하기 위한 테스트 코드를 작성해주기 전에 like/urls.py 코드를 조금 수정해주었다.

 

# like/urls.py

from django.urls import path
from like import views

urlpatterns = [
    # like/
    path('', views.LikeView.as_view(), name="like_view"),
]

 

테스트 코드를 작성할 때 해당 view의 URL을 가져와야 하는데, 설정한 URL을 이름으로 가져오기 위해 name="like_view"를 추가해주었다.

 

이제 직접 테스트 코드를 작성해줄 차례인데, like/views.py에 맞게 테스트하고 싶은 부분을 확인해보았다.

 

like/views.py

 

좋아요 기능 API를 확인하고자 하는 부분이 6개나 있는 것을 볼 수 있었다.

 

1. 좋아요 등록 성공
2. 좋아요 등록 실패
3. 좋아요 등록 중복 에러
4. 좋아요 취소 성공
5. 좋아요 취소 실패
6. 미등록된 좋아요 취소 에러

 

이제 해당 부분들을 확인하기 위한 테스트 코드를 like/tests.py에서 코드로 작성해보았다.

 

# like/tests.py

from django.urls import reverse

from rest_framework.test import APITestCase

from user.models import User
from comment.models import PostType
from comment.models import Like

class LikePostAPIViewTest(APITestCase):
    def setUp(self):
        self.user_data = {"username": "admin", "email": "admin@email.com", "passowrd": "1234"}
        self.user = User.objects.create_user("admin", "1234")

        self.posttype_data = {"typename": "리뷰"}
        self.posttype = PostType.objects.create(**self.posttype_data)

        self.like_data = {"user": 1, "posttype": 1, "post_id": 2}

    def test_like_post(self):
        response = self.client.post(
            path=reverse("like_view"),
            data=self.like_data,
            format="json",
        )
        print("post :", response.data)
        self.assertEqual(response.status_code, 200)

    def test_like_post_overlap(self):
        self.like = Like.objects.create(user=self.user, posttype=self.posttype, post_id=2)
        response = self.client.post(
            path=reverse("like_view"),
            data=self.like_data,
            format="json",
        )
        print("post_overlap :", response.data)
        self.assertEqual(response.status_code, 400)

    def test_like_post_fail(self):
        self.like_data = self.like_data = {"user": 1, "posttype": 1}
        response = self.client.post(
            path=reverse("like_view"),
            data=self.like_data,
            format="json",
        )
        print("post_fail :", response.data)
        self.assertEqual(response.status_code, 400)

class LikeDeleteAPIViewTest(APITestCase):
    def setUp(self):
        self.user_data = {"username": "admin", "email": "admin@email.com", "passowrd": "1234"}
        self.user = User.objects.create_user("admin", "1234")

        self.posttype_data = {"typename": "리뷰"}
        self.posttype = PostType.objects.create(**self.posttype_data)

        self.like = Like.objects.create(user=self.user, posttype=self.posttype, post_id=2)

        self.like_data = {"user": 1, "posttype": 1, "post_id": 2}

    def test_like_delete(self):
        response = self.client.delete(
            path=reverse("like_view"),
            data=self.like_data,
            format="json",
        )
        print("delete :", response.data)
        self.assertEqual(response.status_code, 200)

    def test_like_delete_not_register(self):
        self.like_data = {"user": 1, "posttype": 1, "post_id": 3}
        response = self.client.delete(
            path=reverse("like_view"),
            data=self.like_data,
            format="json",
        )
        print("delete_not_register :", response.data)
        self.assertEqual(response.status_code, 400)

    def test_like_delete_fail(self):
        self.like_data = {"user": 1, "posttype": 1}
        response = self.client.delete(
            path=reverse("like_view"),
            data=self.like_data,
            format="json",
        )
        print("delete_fail :", response.data)
        self.assertEqual(response.status_code, 400)

 

해당 코드를 작성한 뒤 다음 명령어를 입력하여 테스트 코드를 실행해보았다.

 

$ python manage.py test

좋아요 테스트 코드

 

해당 API를 확인하기 위한 테스트 코드가 의도대로 잘 작동하는 것을 볼 수 있었다.

 

-

 

오늘은 맡은 API에 대한 테스트 코드를 작성해보았다.

 

Postman을 활용하여 API가 동작하는 것을 확인해봤었는데, 따로 Django 프로젝트 내에서 테스트 코드를 작성하여 해당 API가 잘 작동되는지 확인을 해보았다.

 

Postman과는 다른 방식으로 API 동작을 확인해보니 색다른 느낌이 들기도 하고 테스트 코드를 작성하여 확인하는 방식도 있다는 것을 공부하게 되는 계기가 되었다.

 

:P