Как использовать фикстуры для создания временных файлов и их удаления после выполнения теста?

Фикстуры pytest позволяют создавать временные файлы и автоматически удалять их после теста:


    import pytest
    import tempfile
    import os

    @pytest.fixture
    def temp_file():
      """Создает временный файл и возвращает его имя."""
      with tempfile.NamedTemporaryFile(delete=False) as tmp:
        tmp_name = tmp.name
      yield tmp_name
      os.remove(tmp_name) # Удаляем файл после выполнения теста

    def test_use_temp_file(temp_file):
      """Тест, использующий временный файл."""
      file_path = temp_file
      with open(file_path, 'w') as f:
        f.write("Test data")
      assert os.path.exists(file_path)
      # После завершения теста файл будет автоматически удален.
  

Пояснения:

  • Используем tempfile.NamedTemporaryFile(delete=False) чтобы файл не удалялся сразу после закрытия.
  • yield разделяет фикстуру на этапы: создание (до yield) и удаление (после yield).
  • В блоке после yield вызываем os.remove() для удаления временного файла.
  • temp_file передается в тест как аргумент.

Для создания временных файлов и их автоматического удаления после выполнения тестов в Python с использованием pytest, можно использовать фикстуру tmp_path.

Вот пример:


import pytest
import os

@pytest.fixture
def temp_file(tmp_path):
    """
    Создает временный файл и возвращает его путь.
    После завершения теста файл будет автоматически удален.
    """
    d = tmp_path / "sub"
    d.mkdir()
    p = d / "temp_file.txt"
    p.write_text("содержимое файла")
    return p

def test_use_temp_file(temp_file):
    """
    Тест, использующий временный файл.
    """
    path = temp_file
    assert os.path.exists(path)
    content = path.read_text()
    assert content == "содержимое файла"
    # после завершения этого теста файл будет удален
    

Объяснение:

  • tmp_path: Это встроенная фикстура pytest, которая предоставляет объект pathlib.Path, указывающий на временный каталог, уникальный для каждого теста. Этот каталог и все его содержимое будут автоматически удалены после завершения теста, даже если тест завершится неудачно.
  • temp_file фикстура:
    • Принимает tmp_path в качестве аргумента, получая доступ к временному каталогу.
    • Создает подкаталог "sub" во временном каталоге (d = tmp_path / "sub", d.mkdir()).
    • Создает файл "temp_file.txt" внутри подкаталога (p = d / "temp_file.txt").
    • Записывает текст в файл (p.write_text("содержимое файла")).
    • Возвращает объект pathlib.Path, представляющий путь к созданному файлу.
  • test_use_temp_file функция:
    • Принимает temp_file в качестве аргумента, получая путь к временному файлу, созданному фикстурой.
    • Проверяет, существует ли файл.
    • Читает содержимое файла и проверяет его соответствие ожидаемому.
  • Автоматическая очистка: После завершения test_use_temp_file pytest автоматически удалит временный каталог и все его содержимое (включая "sub" и "temp_file.txt"), обеспечивая чистую среду для следующих тестов.

Преимущества использования tmp_path:

  • Изоляция тестов: Каждый тест получает свой собственный временный каталог, предотвращая конфликты между тестами.
  • Автоматическая очистка: Временные файлы и каталоги автоматически удаляются, избавляя от необходимости вручную управлять удалением и предотвращая "мусор" в файловой системе.
  • Простота использования: Интеграция с pytest позволяет легко создавать и использовать временные файлы в тестах.
  • Кроссплатформенность: tmp_path работает на разных операционных системах.

Альтернативные подходы (менее предпочтительны):

Хотя tmp_path является рекомендуемым способом, можно использовать модули tempfile и os для создания и удаления временных файлов, но это потребует ручного управления удалением, что более подвержено ошибкам и менее удобно.

0