Django Web Framework/Django Pytest

Rest Framework를 위한 pytest 예시 코드

bluebamus 2023. 4. 23.

https://www.django-rest-framework.org/api-guide/testing/

 

Testing - Django REST framework

 

www.django-rest-framework.org

 

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()

 

댓글