Тестирование крупного Django-монолита: от хаоса с ID к стабильным прогонам в pytest
xanhex 53 минуты назад Тестирование крупного Django-монолита: от хаоса с ID к стабильным прогонам в pytest Простой 11 мин 1.5K Блог компании Домклик Python * Django * Тестирование веб-сервисов * Кейс Всем привет!...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: xanhex 53 минуты назад Тестирование крупного Django-монолита: от хаоса с ID к стабильным прогонам в pytest Простой 11 мин 1. 5K Блог компании Домклик Python * Django * Тестирование веб-сервисов * Кейс Всем привет! Сегодня хочу рассказать об особенностях автоматического тестирования крупного проекта на Django, в котором тесты написаны в разных стилях, а модели данных имеют множество пересечений.
Поговорим о том, как привести всё к единому знаменателю без риска возникновения непредсказуемого поведения тестов, и разберём конфигурацию pytest, параметры его запуска, работу с фабриками моделей и стили тестирования в двух парадигмах (Django и чистый pytest). Чтобы не раскрывать код коммерческого проекта, для эксперимента я создал учебный Django‑проект с аналогичными особенностями. В нём оставлено только всё необходимое для нашей задачи — проверки поведения автотестов при различных настройках.
Технические детали
Основные проблемы, с которыми я столкнулся при работе с проектом: Различия в поведении тестов при подготовке данных в разных парадигмах — Django и чистом pytestИспользование захардкоженных ID-сущностей в константах проектаРучные миграции данных с созданием записей в таблицахОсобенности и нюансы написания фабрик моделейНепредсказуемое поведение тестов при их параллельном запускеПоиск оптимальных настроек pytestИтак, поднимаем PostgreSQL в Docker и приступаем к разбору! Важно отметить, что тестовые данные мы будем хранить в памяти (tmpfs). Это значительно ускоряет прогон тестов, но никак не влияет на воспроизводимость описанных выше проблем.
Вот как выглядит единственная модель проекта, которую мы будем тестировать:from django. db import models class A(models. Model): name = models.
CharField(max_length=100, unique=True)Обратите внимание на уникальность поля name — это пригодится нам позже. Вьюха на простое создание записи:from rest_framework import generics from sandbox. models import A from sandbox.
Отраслевые последствия
serializers import ASerializer class SandboxCreateAView(generics. CreateAPIView): queryset = A. all() serializer_class = ASerializerНапишем фабрику модели для создания записей внутри самих тестов:import factory from factory.
django import DjangoModelFactory from sandbox. models import A class AFactory(DjangoModelFactory): name = factory. Sequence(lambda n: f' class Meta: model = ASequence позволяет всегда генерировать уникальные имена, чтобы наш Constrain успешно проходил.
Настало время перейти к написанию самих тестов. Наш первый сценарий — создание записей в таблице A и подготовка тестовых данных через фабрику. import json import pytest from django.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





