Django + Pytest

pytest предоставляет более мощные возможности для тестирования Django приложений по сравнению со стандартным unittest.

Установка

1# Установка пакета
2pip install pytest pytest-django
1# Или через Poetry
2poetry add pytest pytest-django

Настройка

1# pytest.ini
2[tool:pytest]
3DJANGO_SETTINGS_MODULE = myproject.settings
4python_files = tests.py test_*.py *_tests.py

Фикстуры для Django

 1import pytest
 2from django.contrib.auth.models import User
 3
 4@pytest.fixture
 5def user():
 6    return User.objects.create_user('testuser', 'test@example.com')
 7
 8@pytest.fixture
 9def client():
10    from django.test import Client
11    return Client()
12
13@pytest.mark.django_db
14def test_user_creation(user):
15    assert user.username == 'testuser'
16    assert user.email == 'test@example.com'

Тестирование API

 1import pytest
 2from rest_framework.test import APIClient
 3
 4@pytest.fixture
 5def api_client():
 6    return APIClient()
 7
 8@pytest.mark.django_db
 9def test_create_book(api_client, user):
10    api_client.force_authenticate(user=user)
11    data = {'title': 'Test Book', 'author': 'Test Author'}
12    response = api_client.post('/api/books/', data)
13    assert response.status_code == 201
14    assert response.data['title'] == 'Test Book'

Параметризованные тесты

 1import pytest
 2
 3@pytest.mark.parametrize("username,email,expected", [
 4    ("user1", "user1@test.com", True),
 5    ("", "user2@test.com", False),
 6    ("user3", "", False),
 7])
 8@pytest.mark.django_db
 9def test_user_validation(username, email, expected):
10    if expected:
11        user = User.objects.create_user(username, email)
12        assert user.username == username
13    else:
14        with pytest.raises(ValueError):
15            User.objects.create_user(username, email)

FAQ

Q: Как тестировать API endpoints?
A: Используй client фикстуру и pytest.mark.django_db.

Q: Можно ли тестировать асинхронные views?
A: Да, используй async/await синтаксис в тестах.