Работали ли вы с Django в контексте тестирования?

«Работали ли вы с Django в контексте тестирования?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я имел опыт написания и поддержки тестов для веб-приложений на Django. Моя работа была сосредоточена на обеспечении качества бэкенд-логики.

Виды тестов, которые я писал и запускал:

  1. Модульные тесты (Unit Tests): Тестировал отдельные компоненты — модели, формы, утилитные функции — в изоляции.

    # tests/test_models.py
    from django.test import TestCase
    from .models import Product
    
    class ProductModelTest(TestCase):
        def test_product_creation(self):
            """Проверяем, что продукт создается с корректным слагом."""
            product = Product.objects.create(name="Test Product", price=100)
            self.assertEqual(product.slug, "test-product")
  2. Интеграционные тесты API: Использовал django.test.Client или APIClient из Django REST Framework для тестирования эндпоинтов.

    # tests/test_api.py
    from rest_framework.test import APITestCase
    from rest_framework import status
    
    class ProductAPITest(APITestCase):
        def test_list_products(self):
            response = self.client.get('/api/products/')
            self.assertEqual(response.status_code, status.HTTP_200_OK)
            self.assertContains(response, 'results')
  3. Тесты с использованием тестовой БД: Django автоматически создает и уничтожает изолированную тестовую базу данных, что гарантирует чистоту каждого теста.

Ключевые практики:

  • Использование фикстур (fixtures) или фабрик (например, factory_boy) для создания тестовых данных.
  • Мокание внешних сервисов (платежных шлюзов, почтовых серверов) с помощью unittest.mock.
  • Настройка покрытия кода (coverage) с помощью pytest-cov для отслеживания процента протестированного кода.
  • Интеграция тестов в CI/CD пайплайн (GitHub Actions, GitLab CI) для автоматического запуска при каждом пулл-реквесте.