Django Web Framework/Django Pytest
Rest Framework를 위한 pytest 예시 코드
https://www.django-rest-framework.org/api-guide/testing/
fixture :
- pytest에서 제공하는 client fixture가 아닌 rest_framework.test의 apiclient 사용
import pytest
from django.urls import reverse
from django.contrib.auth.models import User
from rest_framework.test import APIClient
from .models import Post
@pytest.fixture
def api_client():
return APIClient()
@pytest.fixture
def user():
return User.objects.create_user(
username='testuser',
password='testpass',
)
@pytest.fixture
def post():
return Post.objects.create(
title='Test Post',
content='This is a test post.',
)
1. 로그인이 필요한 페이지에 접근하는 테스트
def test_login_required(api_client):
url = reverse('profile')
response = api_client.get(url)
assert response.status_code == 403
2. 로그인한 사용자가 프로필 페이지에 접근하는 테스트
def test_profile_page_logged_in(api_client, user):
url = reverse('profile')
api_client.force_authenticate(user=user)
response = api_client.get(url)
assert response.status_code == 200
3. 새 게시물 작성 페이지에 접근하는 테스트
def test_create_post_page(api_client, user):
url = reverse('post_create')
api_client.force_authenticate(user=user)
response = api_client.get(url)
assert response.status_code == 200
4. 새 게시물 작성하는 테스트
def test_create_post(api_client, user):
url = reverse('post_create')
api_client.force_authenticate(user=user)
data = {
'title': 'New post',
'content': 'This is a new post.'
}
response = api_client.post(url, data=data)
assert response.status_code == 201
assert Post.objects.filter(title=data['title']).exists()
5. 게시물 목록 페이지에 접근하는 테스트
def test_post_list_page(api_client):
url = reverse('post_list')
response = api_client.get(url)
assert response.status_code == 200
6. 게시물 상세 페이지에 접근하는 테스트
def test_post_detail_page(api_client, post):
url = reverse('post_detail', args=[post.id])
response = api_client.get(url)
assert response.status_code == 200
7. 게시물 수정 페이지에 접근하는 테스트
def test_post_update_page(api_client, user, post):
url = reverse('post_update', args=[post.id])
api_client.force_authenticate(user=user)
response = api_client.get(url)
assert response.status_code == 200
8. 게시물 수정하는 테스트
def test_post_update(api_client, user, post):
url = reverse('post_update', args=[post.id])
api_client.force_authenticate(user=user)
data = {
'title': 'Updated post',
'content': 'This is an updated post.'
}
response = api_client.put(url, data=data)
assert response.status_code == 200
post.refresh_from_db()
assert post.title == data['title']
9. 게시물 삭제하는 테스트
def test_post_delete(api_client, user, post):
url = reverse('post_delete', args=[post.id])
api_client.force_authenticate(user=user)
response = api_client.delete(url)
assert response.status_code == 204
assert not Post.objects.filter(id=post.id).exists()
10. 인증된 사용자가 댓글을 게시하는 테스트
def test_comment_create(api_client, user, post):
url = reverse('comment_create')
api_client.force_authenticate(user=user)
data = {
'post': post.id,
'content': 'This is a test comment.'
}
response = api_client.post(url, data=data)
assert response.status_code == 201
assert post.comments.filter(content=data['content']).exists()
'Django Web Framework > Django Pytest' 카테고리의 다른 글
pytest에서 class를 사용할 때 이점을 보여주는 경우에 대한 정리 (0) | 2023.06.08 |
---|---|
Template와 json 통신을 위한 pytest 예시 코드 (0) | 2023.04.23 |
[udemy] Real World Python Test Automation with Pytest 학습 (0) | 2023.04.14 |
pytest-mock의 사용법 (0) | 2023.04.14 |
pytest 확장 라이브러리 정리 (0) | 2023.04.09 |
댓글