Python: Как мне сделать временные файлы в моем наборе тестов? - PullRequest
25 голосов
/ 17 ноября 2010

(я использую Python 2.6 и nose.)

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

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

Ответы [ 5 ]

26 голосов
/ 17 ноября 2010

FWIW используя py.test вы можете написать:

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

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

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

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

Но также можно просто преобразовать его в "строковый" путь:

tmpdir = str(tmpdir)
15 голосов
/ 17 ноября 2010

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

4 голосов
/ 08 июня 2012

Вместо непосредственного использования 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

1 голос
/ 05 января 2019

Чтобы создать временный файл с пользовательским содержимым для ваших тестов, вы можете использовать этот класс:

import os, tempfile

class TestFileContent:                                                                                                  
    def __init__(self, content):                                                                                        

        self.file = tempfile.NamedTemporaryFile(mode='w', delete=False)                                                 

        with self.file as f:                                                                                            
            f.write(content)                                                                                            

    @property                                                                                                           
    def filename(self):                                                                                                 
        return self.file.name                                                                                           

    def __enter__(self):                                                                                                
        return self                                                                                                     

    def __exit__(self, type, value, traceback):                                                                         
        os.unlink(self.filename)                                                                                        

Этот класс создаст временный файл, запишет содержимое в него, а затем закроет файл. Вы используете его внутри оператора with, чтобы гарантировать, что файл будет удален после использования следующим образом:

    with TestFileContent(
'''Hello, world
'''
    ) as test_file:

        # Here, a temporary file has been created in the file named test_file.filename with the specified content
        # This file will be deleted once you leave the with block
0 голосов
/ 08 февраля 2019

Для людей, которые сталкиваются с этим в будущем, но также по какой-то причине отказываются использовать pytest:

Я написал tempcase , небольшую библиотеку, которая предоставляет подкласс unittest.TestCase судобные методы для обработки временных каталогов.Каталоги не создаются до тех пор, пока вы не запросите путь к ним, и они будут распределены по пространству имен для проекта, класса TestCase, метки времени и метода тестирования.Они автоматически очищаются впоследствии.Вы можете отключить очистку для проверки выходных данных, установив свойство.

Существует также декоратор, который можно применять к отдельным тестам, если вы переносите код постепенно.

...