Template와 json 통신을 위한 pytest 예시 코드
https://docs.djangoproject.com/en/4.2/topics/testing/tools/#the-test-client
fixture :
- pytest에서 제공하는 client fixture가 아닌 rest_framework.test의 apiclient 사용
import pytest
from django.urls import reverse
from django.contrib.auth.models import User
from django.test import Client
from .models import Post
@pytest.fixture
def client():
return Client()
@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(client):
url = reverse('profile')
response = client.get(url)
assert response.status_code == 302
assert 'login' in response.url
2. 로그인한 사용자가 프로필 페이지에 접근하는 테스트
def test_profile_page_logged_in(client, user):
url = reverse('profile')
client.login(username='testuser', password='testpass')
response = client.get(url)
assert response.status_code == 200
3. 새 게시물 작성 페이지에 접근하는 테스트
def test_create_post_page(client, user):
url = reverse('post_create')
client.login(username='testuser', password='testpass')
response = client.get(url)
assert response.status_code == 200
4. 새 게시물 작성하는 테스트
def test_create_post(client, user):
url = reverse('post_create')
client.login(username='testuser', password='testpass')
data = {
'title': 'New post',
'content': 'This is a new post.'
}
response = client.post(url, data=data)
assert response.status_code == 302
assert Post.objects.filter(title=data['title']).exists()
5. 게시물 목록 페이지에 접근하는 테스트
def test_post_list_page(client):
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
6. 게시물 상세 페이지에 접근하는 테스트
def test_post_detail_page(client, post):
url = reverse('post_detail', args=[post.id])
response = client.get(url)
assert response.status_code == 200
7. 게시물 수정 페이지에 접근하는 테스트
def test_post_update_page(client, user, post):
url = reverse('post_update', args=[post.id])
client.login(username='testuser', password='testpass')
response = client.get(url)
assert response.status_code == 200
8. 게시물 수정하는 테스트
def test_post_update(client, user, post):
url = reverse('post_update', args=[post.id])
client.login(username='testuser', password='testpass')
data = {
'title': 'Updated post',
'content': 'This is an updated post.'
}
response = client.post(url, data=data)
assert response.status_code == 302
post.refresh_from_db()
assert post.title == data['title']
9. 게시물 삭제하는 테스트
def test_post_delete(client, user, post):
url = reverse('post_delete', args=[post.id])
client.login(username='testuser', password='testpass')
response = client.delete(url)
assert response.status_code == 302
assert not Post.objects.filter(id=post.id).exists()
10. 댓글을 작성하는 테스트
def test_create_comment(client, user, post):
url = reverse('comment_create')
client.login(username='testuser', password='testpass')
data = {
'post': post.id,
'content': 'This is a test comment.',
}
response = client.post(url, data=data)
assert response.status_code == 302
assert post.comments.filter(content=data['content']).exists()
11. 새 게시물을 작성하고, 작성한 게시물이 목록에 올라갔는지 확인하는 테스트
def test_create_post_and_check_list(client, user):
url = reverse('post_create')
client.login(username='testuser', password='testpass')
data = {
'title': 'Test post',
'content': 'This is a test post.',
}
response = client.post(url, data=data)
assert response.status_code == 302
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
assert data['title'] in str(response.content)
12. 게시물을 작성하고, 작성된 게시물의 제목을 수정하는 테스트
def test_edit_post_title(client, user, post):
url = reverse('post_edit', args=[post.id])
client.login(username='testuser', password='testpass')
data = {
'title': 'New title',
}
response = client.post(url, data=data)
assert response.status_code == 302
post.refresh_from_db()
assert post.title == data['title']
13. 게시물을 작성하고, 작성된 게시물의 내용을 수정하는 테스트
def test_edit_post_content(client, user, post):
url = reverse('post_edit', args=[post.id])
client.login(username='testuser', password='testpass')
data = {
'content': 'This is an updated post.',
}
response = client.post(url, data=data)
assert response.status_code == 302
post.refresh_from_db()
assert post.content == data['content']
14. 게시물을 작성하고, 작성된 게시물을 삭제하는 테스트
def test_delete_post(client, user, post):
url = reverse('post_delete', args=[post.id])
client.login(username='testuser', password='testpass')
response = client.post(url)
assert response.status_code == 302
assert not Post.objects.filter(id=post.id).exists()
15. 게시물을 작성하고, 작성된 게시물에 댓글을 작성하는 테스트
def test_create_comment_on_post(client, user, post):
url = reverse('comment_create', args=[post.id])
client.login(username='testuser', password='testpass')
data = {
'content': 'This is a test comment.',
}
response = client.post(url, data=data)
assert response.status_code == 302
post.refresh_from_db()
assert post.comments.filter(content=data['content']).exists()
16. 댓글을 작성하고, 작성한 댓글이 게시물에 표시되는지 확인하는 테스트
def test_comment_appears_on_post(client, user, post, comment):
url = reverse('post_detail', args=[post.id])
response = client.get(url)
assert response.status_code == 200
assert comment.content in str(response.content)
17. 게시물을 작성하고, 작성된 게시물에 좋아요를 누르는 테스트
def test_like_post(client, user, post):
url = reverse('post_like', args=[post.id])
client.login(username='testuser', password='testpass')
response = client.post(url)
assert response.status_code == 200
post.refresh_from_db()
assert post.likes.filter(user=user).exists()
18. 게시물을 작성하고, 작성된 게시물의 작성자 정보를 확인하는 테스트
def test_view_author_info_on_post(client, user, post):
url = reverse('post_detail', args=[post.id])
response = client.get(url)
assert response.status_code == 200
assert post.author.username in str(response.content)
19. 게시물 목록을 조회하고, 각 게시물의 작성자 정보를 확인하는 테스트
def test_view_author_info_on_post_list(client, user, post):
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
assert post.author.username in str(response.content)
20. 특정 사용자가 작성한 게시물 목록을 조회하는 테스트
def test_view_posts_by_user(client, user, post):
url = reverse('user_posts', args=[user.username])
response = client.get(url)
assert response.status_code == 200
assert post.title in str(response.content)
21. 로그인한 사용자가 작성한 게시물 목록을 조회하는 테스트
def test_view_posts_by_logged_in_user(client, user, post):
url = reverse('my_posts')
client.login(username='testuser', password='testpass')
response = client.get(url)
assert response.status_code == 200
assert post.title in str(response.content)
22. 게시물 목록을 조회하고, 각 게시물의 댓글 수를 확인하는 테스트
def test_view_comment_count_on_post_list(client, user, post, comment):
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
assert str(post.comments.count()) in str(response.content)
23. 게시물을 작성하고, 작성된 게시물이 최근에 작성한 게시물로 표시되는지 확인하는 테스트
def test_view_recent_post_on_top(client, user, post):
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
assert post.title in str(response.content)
assert str(response.content).index(post.title) < str(response.content).index(Post.objects.order_by('-created_at').first().title)
24. 게시물을 작성하고, 작성된 게시물이 인기 있는 게시물 목록에 표시되는지 확인하는 테스트
def test_view_popular_post_on_top(client, user, post):
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
assert post.title in str(response.content)
popular_posts = Post.objects.annotate(num_likes=Count('likes')).order_by('-num_likes')
assert post in popular_posts
25.특정 사용자가 작성한 게시물 목록을 조회하고, 각 게시물의 좋아요 수를 확인하는 테스트
def test_view_like_count_on_user_posts(client, user, post):
url = reverse('user_posts', args=[user.username])
response = client.get(url)
assert response.status_code == 200
assert str(post.likes.count()) in str(response.content
26. 게시물을 작성하고, 작성된 게시물에 댓글을 작성하고 해당 댓글이 게시물 상세 페이지에서 표시되는지 확인하는 테스트
def test_view_comment_on_post_detail(client, user, post, comment):
url = reverse('post_detail', args=[post.id])
response = client.get(url)
assert response.status_code == 200
assert comment.content in str(response.content)
27. 게시물을 작성하고, 작성된 게시물을 수정하는 테스트
def test_update_post(client, user, post):
url = reverse('post_edit', args=[post.id])
client.login(username='testuser', password='testpass')
new_title = 'New Title'
new_content = 'New Content'
response = client.post(url, {'title': new_title, 'content': new_content})
assert response.status_code == 302
post.refresh_from_db()
assert post.title == new_title
assert post.content == new_content
28. 게시물을 작성하고, 작성된 게시물을 삭제하는 테스트
def test_delete_post(client, user, post):
url = reverse('post_delete', args=[post.id])
client.login(username='testuser', password='testpass')
response = client.post(url)
assert response.status_code == 302
assert not Post.objects.filter(id=post.id).exists()
29. 게시물 목록을 조회하고, 페이지네이션을 확인하는 테스트
def test_pagination_on_post_list(client, user):
for i in range(11):
Post.objects.create(
author=user,
title=f'Test Post {i}',
content=f'Test Content {i}',
)
url = reverse('post_list')
response = client.get(url)
assert response.status_code == 200
assert 'Test Post 0' in str(response.content)
assert 'Test Post 10' not in str(response.content)
assert 'page=2' in str(response.content)
30. 게시물 검색 기능을 사용하여 특정 단어가 포함된 게시물을 검색하는 테스트
def test_search_posts(client, user):
post1 = Post.objects.create(
author=user,
title='Test Post 1',
content='Test Content 1',
)
post2 = Post.objects.create(
author=user,
title='Test Post 2',
content='Test Content 2',
)
url = reverse('post_list')
response = client.get(url, {'search': 'Test Post 1'})
assert
'Django Web Framework > Django Pytest' 카테고리의 다른 글
pytest에서 class를 사용할 때 이점을 보여주는 경우에 대한 정리 (0) | 2023.06.08 |
---|---|
Rest Framework를 위한 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 |
댓글