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

avatar
toTheMoon
1 июля 2021 в 20:48
228
2
1

Я хочу создать тест Python с помощью pytest. В тесте я создам временный файл JSON и кое-что сделаю с файлом json. Как мне удалить этот файл, когда я завершу этот тест?

def test_can_do_something():
    tmp_json = create_some_tmp_json_file()
    do_something(tmp_json)
    assert some_statement

В основном я хочу гарантировать, что временный файл JSON будет удален независимо от того, как закончится этот тест. Даже если какое-то исключение, вызванное do_something(). Идиома RAII — хороший выбор. Но как реализовать на питоне?

Источник
0x5453
1 июля 2021 в 21:00
2

Попробуйте использовать пакет tempfile.

Ответы (2)

avatar
schilli
1 июля 2021 в 20:54
2

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

Просто передайте tmp_path в свой тест и используйте его в тесте, как передайте его методу, который записывает файл json.

def test_can_do_something(tmp_path):
    tmp_json = create_some_tmp_json_file(tmp_path)
    do_something(tmp_json)
    assert some_statement

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

См. документы:

Временные каталоги по умолчанию создаются как подкаталоги системного временного каталога. Базовое имя будет pytest-NUM, где NUM будет увеличиваться при каждом запуске теста. Кроме того, будут удалены записи старше 3 временных каталогов.

avatar
jalvarez-outburst
1 июля 2021 в 20:56
0

Используйте try, кроме и finally

def test_can_do_something():
    try:
        tmp_json = create_some_tmp_json_file()
        do_something(tmp_json)
        assert some_statement
    except Exception:
        assert False
    finally:
        deletefile()