📝 Django

Тестирование Django с pytest

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
79
🌳
Уровень
Продвинутый
🐦 💼 ✈️

Охватываемые темы: Установка, conftest.py — фикстуры, Тест модели, Тест view через Client.

Установка

pip install pytest pytest-django
# pytest.ini или pyproject.toml
[pytest]
DJANGO_SETTINGS_MODULE = mysite.settings

conftest.py — фикстуры

# conftest.py
import pytest
from django.contrib.auth.models import User
from tasks.models import Task, Project

@pytest.fixture
def user(db):
    return User.objects.create_user(username='testuser', password='testpass')

@pytest.fixture
def project(db):
    return Project.objects.create(name='Test Project')

@pytest.fixture
def task(db, user, project):
    return Task.objects.create(
        title='Test Task',
        owner=user,
        project=project,
        status='todo',
    )

Тест модели

# tasks/tests/test_models.py
import pytest
from tasks.models import Task

@pytest.mark.django_db
def test_task_creation(user, project):
    task = Task.objects.create(title='Test', owner=user, project=project)
    assert task.title == 'Test'
    assert task.status == 'todo'
    assert str(task) == 'Test'

@pytest.mark.django_db
def test_task_complete(task):
    task.status = 'done'
    task.save()
    assert Task.objects.get(pk=task.pk).status == 'done'

Тест view через Client

# tasks/tests/test_views.py
import pytest
from django.test import Client
from django.urls import reverse

@pytest.mark.django_db
def test_task_list_requires_login(client):
    response = client.get(reverse('task-list'))
    assert response.status_code == 302  # редирект на login

@pytest.mark.django_db
def test_task_list_authenticated(client, user, task):
    client.login(username='testuser', password='testpass')
    response = client.get(reverse('task-list'))
    assert response.status_code == 200
    assert task.title.encode() in response.content

Тест прав доступа

@pytest.mark.django_db
def test_cannot_edit_others_task(client, task):
    other = User.objects.create_user(username='other', password='pass')
    client.login(username='other', password='pass')

    response = client.post(
        reverse('task-edit', kwargs={'pk': task.pk}),
        {'title': 'Hacked!'}
    )
    assert response.status_code in [403, 404]
    task.refresh_from_db()
    assert task.title != 'Hacked!'

Запуск тестов

pytest                          # все тесты
pytest tasks/                   # тесты приложения
pytest -v                       # подробный вывод
pytest -k "test_task"           # по имени
pytest --cov=tasks              # с покрытием

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 138
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 85
📝

Django: Статические файлы

Статические файлы — CSS, JavaScript, изображения, шрифты. Django обрабатывает их особым образом: в разработке раздаёт...

📅 30.06.2026 👁️ 75

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!