Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
← К каналу

Pytest Patterns: Элегантный Teardown через yield и оптимизация скоупов Если вы все еще пишете def teardown_method(self): в классах тестов, вы не испол…

Pytest Patterns: Элегантный Teardown через yield и оптимизация скоупов

Если вы все еще пишете def teardown_method(self): в классах тестов, вы не используете мощь Pytest на 100%.
Фикстуры (fixtures) - это не просто способ передать данные. Это полноценный механизм управления жизненным циклом зависимостей (DI).

1. yield вместо return: Встроенный Teardown
В Pytest фикстура может "замереть", отдать управление тесту, а потом продолжить выполнение. Это реализуется через генератор yield.

Код до yield - это setUp.
Код после yield - это tearDown.

Пример (временная база данных):

import pytest
from sqlalchemy import create_engine

@pytest.fixture
def db_engine():
# Setup: Поднимаем соединение
engine = create_engine("sqlite:///:memory:")

# Передаем объект в тест
yield engine

# Teardown: Этот код выполнится ПОСЛЕ завершения теста
# (даже если тест упал с ошибкой!)
engine.dispose()

Это гарантирует, что ресурсы будут освобождены, и вам не нужны try/finally блоки внутри самих тестов.

2. Scopes: Не создавайте мир заново
По умолчанию фикстура имеет scope='function'. Она создается и умирает для каждого теста. Это безопасно, но медленно, если мы говорим о поднятии Docker-контейнера или коннекта к БД.

Используйте scope='session' для тяжелых ресурсов, которые можно переиспользовать.

Паттерн "Изоляция при общем ресурсе":
Частая задача Middle+: иметь одну БД на весь прогон тестов (быстро), но чистые таблицы для каждого теста (изолированно).

Решение: комбинируем скоупы.

# Живет весь прогон тестов (создается 1 раз)
@pytest.fixture(scope="session")
def db_engine():
engine = create_engine(...)
yield engine
engine.dispose()

# Живет 1 тест (создается N раз)
@pytest.fixture(scope="function")
def db_session(db_engine):
# Берем engine из сессионной фикстуры
connection = db_engine.connect()
transaction = connection.begin() # Начали транзакцию

session = Session(bind=connection)
yield session

session.close()
# ROLLBACK транзакции после теста вернет базу в исходное состояние!
transaction.rollback()
connection.close()

Итог:

🟢 Используйте yield для очистки ресурсов.
🟢 Тяжелые объекты (Engine, Client, Container) - в scope='session'.
🟢 Легкие объекты с состоянием (Session, User) - в scope='function', наследуясь от тяжелых.

#pytest #testing #qa #bestpractices #python

👉 @BookPython
← Предыдущий пост ⚡ Как ускорить код на Python? Используем map, filter, reduce ⚡ Привет, друзья! … Следующий пост → Одной из самых непоследовательных частей синтаксиса Python являются литералы кор…
Другие главы канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 30.04.2026
У Python очень короткий список встроенных констант. Одна из них — Ellipsis, кото…
👁 528 просмотров
Глава от 29.04.2026
💡10 функций, для продвинутых Python-разработчиков 1. Разворачиваем вложенных с…
👁 695 просмотров
Глава от 28.04.2026
Если вы хотите итерироваться одновременно по нескольким итерируемым объектам, фу…
👁 651 просмотров
Глава от 28.04.2026
❓Как управлять техническим подразделением опытных инженеров и быть сильным и муд…
👁 758 просмотров
Глава от 27.04.2026
Иногда в тестах нужно сравнивать сложные структуры, игнорируя некоторые значения…
👁 1 057 просмотров
Глава от 26.04.2026
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 ht…
👁 1 241 просмотров
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
Удалить этот пост Удалить канал
🔍
Архив всех постов Макс
Поиск по тексту среди 3,342,037 постов из 200,359 каналов. Фильтры по дате, видео, репостам и удалённым публикациям.
1 ₽ — 7 дней доступа
далее 490 ₽/мес
Получить доступ за 1 ₽
или войти, если уже есть аккаунт

Связанные темы в других каналах

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
👥 232 475 · +146 700/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Номер заявления для регистрации в РКН: № 6979154178 Розыгрыши: kichaev@wylsacom.med…
👥 127 363 · +3 505/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
Информация БПЛА Белгород, Белгородский район — специализированный канал в мессенджере Макс, посвященный новостям и информации о беспилотных летательных аппаратах в регион…
👥 116 323 · +5 702/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 57 372 · +2 378/7д
@hitech
Hi-Tech
Оперативные новости, обзоры гаджетов, собственное видео, трансляции мировых анонсов и мероприятий По вопросам сотрудничества и размещения рекламы i.ostapenko@corp.mail.r…
👥 53 751 · +1 649/7д
@yandex
Яндекс
Технологии будущего и сервисы, которые делают жизнь лучше уже сегодня
👥 37 356 · +9 059/7д

Популярные посты канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.»

Списковые включения (list comprehensions) могут содержать несколько операторов for и if: In : [(x, y) for x in range(3) for y in range(3)] …
👁 6 260 просмотров
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то multiprocessing.Pool - это то, что вам ну…
👁 6 240 просмотров
Pydantic V2: Забываем root_validator, используем model_validator правильно Переход на Pydantic V2, это не только ускорение за счет ядра на …
👁 6 196 просмотров
Ранее мы затронули типизацию в фикстурах (косвенно), поэтому сегодня поговорим про: Protocol vs ABC: Утиная типизация на стероидах (Static …
👁 6 182 просмотров
Structured Concurrency в Python 3.11+ (TaskGroup vs Gather) Если вы до сих пор используете asyncio.gather() для запуска конкурентных задач,…
👁 6 180 просмотров
Одной из самых непоследовательных частей синтаксиса Python являются литералы кортежей. По сути, чтобы создать кортеж, вы просто пишете знач…
👁 6 158 просмотров
10 полезных библиотек для Python-разработчика Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу ра…
👁 6 153 просмотров
📌 Декораторы в Python: как они работают и зачем нужны? Сегодня я покажу вам, как работают декораторы в Python и зачем они вообще нужны. Де…
👁 6 150 просмотров
🐍 Как улучшить читаемость кода в Python? Читаемый код - это не роскошь, а необходимость. Если ваш код трудно понять, даже если он работает,…
👁 6 147 просмотров
⚡ Как ускорить код на Python? Используем map, filter, reduce ⚡ Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, …
👁 6 142 просмотров
Ловушка замыканий: Почему ваши лямбды в цикле сломаны (Late Binding) Вы пишете код, который генерирует список функций (например, колбэки дл…
👁 6 136 просмотров
Профилируем Python в продакшене: почему cProfile не подходит, и чем хорош py-spy Когда на проде начинает течь память или скачет CPU, первая…
👁 6 101 просмотров
Оптимизация SQL-запросов в Django ORM Сегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эф…
👁 6 084 просмотров
🔥 Как ускорить Python-код в 10 раз? Сегодня покажу вам мощный инструмент для оптимизации кода - Numba. Это библиотека, которая позволяет ко…
👁 6 054 просмотров
Оптимизация кода с помощью генераторов в Python Сегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, э…
👁 6 020 просмотров
Обычно вы взаимодействуете с генератором, запрашивая данные с помощью next(gen). В Python 3 вы также можете отправлять значения обратно в ге…
👁 6 010 просмотров
Python поддерживает несколько способов запуска скрипта. Обычный вариант — это python foo.py; в этом случае foo.py просто выполняется. Однак…
👁 6 003 просмотров
🚀 5 крутых Python-фишек, о которых знают не все Python — мощный и удобный язык, но даже опытные разработчики иногда не знают всех его воз…
👁 5 985 просмотров
Как быстро очистить список в Python? Сегодня я покажу вам несколько способов очистки списка в Python и расскажу, какой вариант лучше в зави…
👁 5 951 просмотров
Одна и та же строка может быть представлена по-разному в Unicode, и стандарт это учитывает. Он определяет два типа эквивалентности: последо…
👁 5 924 просмотров
🏷 Темы и теги
#pytest #testing #qa #bestpractices #python #telegram bots #web scraping #django #fastapi #asyncio #Технологии
📋 О канале Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
Учим язык Python на практике. Создание веб-приложений: Django, Flask, FastAPI. Пишем ботов для Телеграм на Aiogram. Парсинг сайтов (Web Scraping): Selenium, BeautifulSoup (BS4), Scrapy. Работа с базами данных (PostgreSQL, Redis, SQL) и API. Асинхронное программирование (Asyncio). Настройка Docker, Git и Linux. Алгоритмы, задачи с собеседований и Roadmap для Junior Python Developer.
📊 Аналитика канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
📌 Данные подтянутся автоматически по ссылке на канал. Логотип необязателен — ускоряет проверку.
🖼 Перетащите картинку или выберите файл
PNG, JPG, WEBP · до 5 МБ
captcha

Нажимая кнопку, вы соглашаетесь на обработку данных.
Проверим и добавим канал в течение суток.