어제 좋아요 테스트 코드를 만든 뒤 오늘은 그에 이어 댓글 테스트 코드도 작성해보고자 하였다.
좋아요 URL과 마찬가지로 tests.py에서 reverse를 사용하기 위해 urls.py에 있는 기존 URL에 대한 name 설정을 해주었다.
# comment/urls.py
from django.urls import path
from comment import views
urlpatterns = [
# comment/
path('', views.CommentView.as_view(), name="comment_post_view"),
path('<comment_id>/', views.CommentView.as_view(), name="comment_put_delete_view"),
path('<posttype_id>/<post_id>/', views.CommentView.as_view(), name="comment_get_view")
]
좋아요 기능에는 등록/삭제 기능에 하나의 URL을 사용하고 있었는데, 댓글 기능은 위 코드를 보면 알 수 있다시피 조금 다르다.
기본 형태인 'comment/'는 등록(post)을 위한 URL이고, 여기서 등록된 댓글에 대한 comment_id가 URL에 붙는다면 해당 댓글에 대한 수정 및 삭제가 가능하도록 해주었다.
그리고 posttype_id와 post_id를 기본 URL에 추가해주면 작성된 글과 유형에 따른 댓글들을 가져와서 볼 수 있도록 설정을 해주었다.
이제 작성된 comment/views.py에 맞게 동작을 테스트하고자 확인을 해주었다.

댓글 기능 API 테스트를 위한 부분을 다음과 같다.
1. 댓글 조회 데이터
2. 댓글 작성 성공
3. 댓글 작성 실패
4. 댓글 수정 성공
5. 댓글 수정 실패
6. 댓글 삭제 성공
7. 댓글 삭제 실패
이제 테스트를 위한 코드를 comment/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 Comment
# 댓글 조회 TestCode
class CommentGetAPIViewTest(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.comment_data = {
"user": 1,
"posttype": 1,
"post_id": 2,
"comment": "댓글 테스트",
"rating": 3.5
}
# 댓글 조회 테스트
def test_comment_get(self):
url = reverse("comment_get_view", kwargs={"posttype_id": 1, "post_id": 2})
response = self.client.get(url)
print("comment_get :", self.comment_data)
self.assertEqual(response.status_code, 200)
# 댓글 작성 TestCode
class CommentPostAPIViewTest(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.comment_data = {
"user": 1,
"posttype": 1,
"post_id": 2,
"comment": "댓글 테스트",
"rating": 3.5
}
# 댓글 작성 성공 테스트
def test_comment_post(self):
response = self.client.post(
path=reverse("comment_post_view"),
data=self.comment_data,
format="json",
)
print("comment_post :", response.data)
self.assertEqual(response.status_code, 200)
# 댓글 작성 실패 테스트
def test_comment_post_fail(self):
self.comment_data = {
"user": 1,
"posttype": 1,
"post_id": None,
"comment": "댓글 테스트",
"rating": 3.5
}
response = self.client.post(
path=reverse("comment_post_view"),
data=self.comment_data,
format="json",
)
print("comment_post_fail :", response.data)
self.assertEqual(response.status_code, 400)
# 댓글 수정 TestCode
class CommentPutAPIViewTest(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.comment = Comment.objects.create(
user=self.user, posttype=self.posttype, post_id=2,
comment="댓글 테스트", rating=3.5)
# 댓글 수정 성공 테스트
def test_comment_get(self):
url = reverse("comment_put_delete_view", kwargs={"comment_id": 1})
self.comment_put = {"user": 1, "comment": "수정", "rating": 2.2}
response = self.client.put(
path=url,
data=self.comment_put,
format="json",
)
print("comment_put :", response.data)
self.assertEqual(response.status_code, 200)
# 댓글 수정 실패 테스트
def test_comment_put_fail(self):
url = reverse("comment_put_delete_view", kwargs={"comment_id": 1})
self.comment_put = {"user": 1, "comment": "수정", "rating": None}
response = self.client.put(
path=url,
data=self.comment_put,
format="json",
)
print("comment_put_fail :", response.data)
self.assertEqual(response.status_code, 400)
# 댓글 삭제 TestCode
class CommentDeleteAPIViewTest(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.comment = Comment.objects.create(
user=self.user, posttype=self.posttype, post_id=2,
comment="댓글 테스트", rating=3.5)
# 댓글 삭제 성공 테스트
def test_comment_delete(self):
url = reverse("comment_put_delete_view", kwargs={"comment_id": 1})
response = self.client.delete(url)
print("comment_delete :", response.data)
self.assertEqual(response.status_code, 200)
# 댓글 삭제 실패 테스트
def test_comment_delete_fail(self):
url = reverse("comment_put_delete_view", kwargs={"comment_id": None})
response = self.client.delete(url)
print("comment_delete_fail :", response.data)
self.assertEqual(response.status_code, 400)
좋아요 테스트를 할 때처럼 테스트 명령어를 입력해준 뒤 정상적으로 테스트 데이터들에 의해 정상적으로 동작하는지 확인을 해보았다.
$ python manage.py test

입력한 테스트 코드가 실행되고 정상적으로 동작을 한 뒤 OK가 뜨는 것을 볼 수 있었다.
댓글 관련 테스트 코드뿐만 아니라 어제 작성을 해주었던 좋아요 테스트 코드 또한 같이 실행되어 테스트가 되는 것 또한 볼 수 있었다.
-
이틀에 걸쳐 댓글 및 좋아요 기능에 대한 테스트 코드를 작성해보았다.
댓글 테스트 코드에서는 더미 데이터를 하나로만 사용하여 테스트를 해보았는데, 단일 데이터에 대한 테스트 코드는 정상적으로 실행되었다.
본문에 나와는 코드대로 직접 코드를 작성하여 생성하는 것이 아닌 Faker() 모듈을 사용하여 테스트용 더미 데이터를 생성하여 사용하는 방법 또한 있다는 것을 뒤늦게 알았다.
다음에 기회가 된다면 Faker()를 사용하여 다수의 더미 데이터를 생성하여 테스트 코드 관리를 시도해보고 싶다.
:P
'TIL 및 WIL > TIL (Today I Learned)' 카테고리의 다른 글
| [TIL] 2022.08.04 (중간 발표, My Little Trip(12)) (0) | 2022.08.04 |
|---|---|
| [TIL] 2022.08.01 (Frontend 작성, My Little Trip(11)) (0) | 2022.08.01 |
| [TIL] 2022.07.27 (TestCode 작성, My Little Trip(9)) (0) | 2022.07.27 |
| [TIL] 2022.07.26 (Django DRF JWT) (0) | 2022.07.26 |
| [TIL] 2022.07.21 (MLT API 구현, My Little Trip(8)) (0) | 2022.07.21 |