Django + Pytest
pytest предоставляет более мощные возможности для тестирования Django приложений по сравнению со стандартным unittest.
Установка
Настройка
Фикстуры для 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 синтаксис в тестах.