2010-11-16 2 views
21

(Я использую Python 2.6 и nose.)Python: Как создать временные файлы в моем тестовом наборе?

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

Как это сделать?

ответ

12

См. Модуль tempfile в стандартной библиотеке - должно быть все, что вам нужно.

25

FWIW с помощью py.test вы можете написать:

def test_function(tmpdir): 
    # tmpdir is a unique-per-test-function invocation temporary directory 

Каждая функция тестирования с помощью «TmpDir» аргумент функции получит чистую пустую директорию, создан как подкаталог «/ TMP/pytest-NUM "(linux, win32 имеет другой путь), где NUM увеличивается для каждого тестового прогона. Последние три каталога хранятся для облегчения проверки, а старые автоматически удаляются. Вы также можете установить базовую папку temp с py.test --basetemp=mytmpdir.

Объект TMPDIR является py.path.local объект, который также можно использовать следующим образом:

sub = tmpdir.mkdir("sub") 
sub.join("testfile.txt").write("content") 

Но это тоже хорошо, чтобы просто преобразовать его в «строку» путь:

tmpdir = str(tmpdir) 
+0

Можно ли использовать tmpdir' funcarg с установкой/отключением xUnit-методов в py.test? Так, например, изменить из 'def setup_method (self, method)' to def def_set_method (self, method, tmpdir) '? – KomodoDave

+0

tmpdir можно использовать, если вы украшаете свой метод установки '' @ pytest.fixture (autouse = True) '', и в этом случае '' setup_method'' может принимать светильники как обычные фитинги для pytest. См. Документацию по приборам по значению автозапуска. – hpk42

4

Вместо того, чтобы использовать tempfile, я предлагаю использовать для него оболочку контекстного менеджера - менеджер контекста позаботится об удалении каталога во всех случаях (успех/отказ/исключение), в основном без шаблона.

Вот как это можно использовать:

from tempdir import TempDir 
... 

# in some test: 
with TempDir() as d: 
    temp_file_name = os.path.join(d.name, 'your_temp_file.name') 
    # create file... 
    # ... 
    # asserts... 

Я использовал домашний выращены версии (реализация довольно короткий - до 20 линий) до точки, когда мне нужно, чтобы использовать его где-то Кроме того, я посмотрел вокруг, если есть пакет, готовый к установке, и действительно есть: tempdir

+0

tempdir не входит в стандартную библиотеку lib: '' 'ImportError: No module tempdir''' – dashesy

+0

пакет не найден по пипсу! 'pip3 search tempdir' ничего не показывает. – kap

+0

Я получил это при попытке: AttributeError: __exit__ –

Смежные вопросы