← Назад к вопросам

Как проводится тестирование в 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 — фиксация времени в тестах
Как проводится тестирование в Django? | PrepBro