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

Почему падают автотесты? Утечка ресурсов и незакрытые соединения в 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 для контроля сетевых подключений
Это спасет от сбоев из-за утечек. В следующем посте разберем, как время может ломать ваши тесты.