Python: Как мне создать временные файлы в моем наборе тестов?

Связанные с временным интервалом расширения, такие как:

public static TimeSpan Seconds(this int seconds)
{
  return TimeSpan.FromSeconds(seconds);
}

public static TimeSpan Minutes(this int minutes)
{
  return TimeSpan.FromMinutes(minutes);
}

, которые позволяют использовать:

1.Seconds()
20.Minutes()

Блокировки расширения, такие как:

public static IDisposable GetReadLock(this ReaderWriterLockSlim slimLock)
{
  slimLock.EnterReadLock();
  return new DisposableAction(slimLock.ExitReadLock);
}

public static IDisposable GetWriteLock(this ReaderWriterLockSlim slimLock)
{
  slimLock.EnterWriteLock();
  return new DisposableAction(slimLock.ExitWriteLock);
}

public static IDisposable GetUpgradeableReadLock(this ReaderWriterLockSlim slimLock)
{
  slimLock.EnterUpgradeableReadLock();
  return new DisposableAction(slimLock.ExitUpgradeableReadLock);
}

, которые позволяют использовать блокировки как:

using (lock.GetUpgradeableReadLock())
{
  // try read
  using (lock.GetWriteLock())
  {
    //do write
  }
}

и многие другие из общих библиотек Lokad

25
задан Ram Rachum 16 November 2010 в 22:27
поделиться

5 ответов

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

16
ответ дан 28 November 2019 в 20:49
поделиться

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)
27
ответ дан 28 November 2019 в 20:49
поделиться

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

4
ответ дан 28 November 2019 в 20:49
поделиться

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

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
2
ответ дан 28 November 2019 в 20:49
поделиться

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

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

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

1
ответ дан 28 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: