tmp_path в pytest: как проверять файлы без общей тестовой папки

tmp_path в pytest: как проверять файлы без общей тестовой папки
Содержание статьи

Если тест создаёт файл, передайте проверяемой функции путь из фикстуры tmp_path. Каждый тест получит собственную временную папку, поэтому результат предыдущего запуска не должен подменить проверку нового. На Mentoring.digital покажем это на сохранении JSON и отдельно разберём, что именно доказывает тест.

Почему общий output.json мешает

Постоянная папка рядом с исходниками связывает тесты состоянием диска. Один тест может прочитать файл другого, а забытый артефакт создаёт ложное впечатление успешной записи. При параллельном запуске появляется ещё и соревнование за один путь.

tmp_path даёт объект pathlib.Path, уникальный для тестовой функции. Это удобная граница зависимости: функция получает путь аргументом и не обязана знать, где тестовая среда хранит свои данные.

Пример записи и проверки содержимого

import json

def save_report(path, report):
    path.write_text(
        json.dumps(report, ensure_ascii=False),
        encoding="utf-8",
    )

def test_save_report(tmp_path):
    path = tmp_path / "report.json"
    expected = {"status": "готово", "count": 2}

    save_report(path, expected)

    actual = json.loads(path.read_text(encoding="utf-8"))
    assert actual == expected
    assert sorted(p.name for p in tmp_path.iterdir()) == ["report.json"]

Сохраните код в test_report.py и запустите python -m pytest test_report.py. Проверка сравнивает восстановленные данные, включая русскую строку, а не только существование файла. Последняя строка выявляет неожиданные соседние файлы в этой папке.

Что такой тест не гарантирует

Равенство словарей не проверяет точное форматирование JSON. Если внешнему потребителю важны отступы или порядок полей, сформулируйте отдельное требование. Пример также не доказывает атомарность записи, устойчивость к заполнению диска или корректность разрешений в рабочей среде.

Если функция должна сама создавать вложенную папку, тест должен передать ещё не существующий вложенный путь. Иначе создание каталога в тесте может скрыть отсутствующую логику приложения. Если функция, наоборот, требует готовый каталог, этот контракт стоит проверить ожидаемой ошибкой.

Изоляция не означает немедленное удаление

pytest может сохранять временные каталоги нескольких последних запусков для диагностики. Не записывайте в них реальные ключи и персональные данные. Пользовательский параметр базовой временной директории требует внимательного выбора пути: не направляйте тестовый запуск в папку с нужными файлами.

В существующем проекте начните с одного нестабильного файлового теста: передайте путь явно, уберите общий output.json и сравните результат повторного запуска. При необходимости устройство фикстур можно разобрать с ментором по Python. Успех здесь означает проверенный контракт записи, а не просто зелёный запуск без утверждений.

Похожие статьи по данной теме