Django Web Framework/Django Pytest

Template와 json 통신을 위한 pytest 예시 코드

bluebamus 2023. 4. 23.

https://docs.djangoproject.com/en/4.2/topics/testing/tools/#the-test-client

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

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

 

댓글