Охватываемые темы: Установка, 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)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!