← Назад к вопросам
Как проводится тестирование в Django?
2.0 Middle🔥 111 комментариев
#Django#Тестирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Тестирование в Django
Django предоставляет встроенный фреймворк для тестирования, основанный на модуле unittest из стандартной библиотеки Python. Это один из самых удобных инструментов для написания unit-тестов, интеграционных тестов и функциональных тестов.
Основные компоненты
1. Django TestCase
Базовый класс для написания тестов:
from django.test import TestCase
from myapp.models import Article
class ArticleTestCase(TestCase):
def setUp(self):
"""Выполняется перед каждым тестом"""
self.article = Article.objects.create(
title="Test Article",
content="Some content"
)
def test_article_creation(self):
"""Проверка создания статьи"""
self.assertEqual(self.article.title, "Test Article")
self.assertIsNotNone(self.article.id)
def test_article_string_representation(self):
"""Проверка __str__ метода"""
self.assertEqual(str(self.article), "Test Article")
2. Тестирование Views
Django предоставляет Client для тестирования HTTP запросов:
from django.test import TestCase, Client
class ArticleViewTestCase(TestCase):
def setUp(self):
self.client = Client()
self.article = Article.objects.create(
title="Published",
content="Content"
)
def test_article_list_view(self):
"""Проверка отображения списка статей"""
response = self.client.get("/articles/")
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Published")
def test_article_detail_view(self):
"""Проверка детального просмотра"""
response = self.client.get(f"/articles/{self.article.id}/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["article"], self.article)
3. Тестирование Models
class UserModelTestCase(TestCase):
def test_user_creation(self):
user = User.objects.create_user(
username="john",
email="john@example.com",
password="secret123"
)
self.assertTrue(user.check_password("secret123"))
self.assertEqual(user.email, "john@example.com")
def test_unique_username(self):
"""Проверка уникальности username"""
User.objects.create_user(username="john", password="pass")
with self.assertRaises(Exception):
User.objects.create_user(username="john", password="pass")
4. Тестирование Forms
from django.test import TestCase
from myapp.forms import ArticleForm
class ArticleFormTestCase(TestCase):
def test_valid_form(self):
form = ArticleForm(data={
"title": "Test",
"content": "Content"
})
self.assertTrue(form.is_valid())
def test_invalid_form(self):
form = ArticleForm(data={"title": ""})
self.assertFalse(form.is_valid())
self.assertIn("title", form.errors)
Запуск тестов
# Все тесты
python manage.py test
# Конкретное приложение
python manage.py test myapp
# Конкретный класс
python manage.py test myapp.tests.ArticleTestCase
# Конкретный метод
python manage.py test myapp.tests.ArticleTestCase.test_article_creation
# С verbose выводом
python manage.py test --verbosity=2
# С сохранением БД после тестов
python manage.py test --keepdb
Использование Fixtures
class ArticleTestCase(TestCase):
fixtures = ["articles.json"]
def test_loaded_data(self):
articles = Article.objects.all()
self.assertEqual(articles.count(), 3)
Мокирование с unittest.mock
from unittest.mock import patch, MagicMock
class ExternalServiceTestCase(TestCase):
@patch("myapp.services.external_api.get_data")
def test_with_mocked_service(self, mock_api):
mock_api.return_value = {"status": "success"}
result = my_function()
self.assertEqual(result, {"status": "success"})
mock_api.assert_called_once()
Тестирование асинхронного кода
from django.test import TestCase
from asgiref.sync import async_to_sync
class AsyncTestCase(TestCase):
def test_async_view(self):
response = self.client.get("/async-endpoint/")
self.assertEqual(response.status_code, 200)
Best Practices
1. Изоляция: Каждый тест должен быть независимым
2. Ясность: Названия тестов должны описывать, что они проверяют
3. Скорость: Используйте --keepdb и минимизируйте создание БД записей
4. Coverage: Проверяйте покрытие кода инструментом coverage.py
5. Организация: Группируйте тесты по TestCase классам логически
Дополнительные инструменты
- pytest-django — интеграция pytest с Django
- factory-boy — создание тестовых данных
- responses — мокирование HTTP запросов
- freezegun — фиксация времени в тестах