Почему падают автотесты? Утечка ресурсов и незакрытые соединения в Pytest

25 марта 2025 г.Код на салфетке
Почему падают автотесты? Утечка ресурсов и незакрытые соединения в Pytest | 🔁 Новости из телеграм - Ghostbase News

Почему падают автотесты? Утечка ресурсов и незакрытые соединения в Pytest

Незакрытые файлы, базы данных или сетевые соединения – классическая причина сбоев тестов в Python. Если тест не очищает за собой ресурсы, следующий тест может наткнуться на занятый файл или исчерпанный лимит соединений.

Представьте, что тест открыл файл и не закрыл его. Следующий тест пытается прочитать пустой файл, но получает старые данные и падает.

def test_write_file():

f = open("test.txt", "w")

f.write("data") # Файл остался открытым!

assert open("test.txt").read() == "data"

def test_read_empty():

assert open("test.txt").read() == "" # Упадет из-за "data"

Как чинить утечки ресурсов?

Контекстные менеджеры. Используйте with для автоматического закрытия:

def test_write_file():

with open("test.txt", "w") as f:

   f.write("data")

with open("test.txt") as f:

   assert f.read() == "data"

Фикстуры с cleanup. Pytest фикстуры с yield очищают ресурсы:

@pytest.fixture

def temp_file():

file = open("test.txt", "w")

yield file

file.close()

Базы данных. Закрывайте сессии явно или используйте фикстуры:

@pytest.fixture

def db_session():

session = Session()

yield session

session.close()

  • Используйте tempfile для создания временных файлов, которые автоматически удаляются

  • Применяйте @pytest.fixture(autouse=True) для глобальной очистки ресурсов

  • Рассмотрите библиотеки вроде pytest-socket для контроля сетевых подключений

Это спасет от сбоев из-за утечек. В следующем посте разберем, как время может ломать ваши тесты.