Связанные с временным интервалом расширения, такие как:
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
См. Модуль tempfile в стандартной библиотеке - должно быть все, что вам нужно.
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)
Вместо непосредственного использования 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
Чтобы создать временный файл с пользовательским контентом для ваших тестов, вы можете использовать этот класс:
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
Для людей, которые сталкиваются с этим в будущем, но также по какой-то причине отказываются использовать pytest:
Я написал tempcase , небольшую библиотеку, которая предоставляет подкласс unittest.TestCase
с удобные методы для обработки временных каталогов. Каталоги не создаются до тех пор, пока вы не запросите путь к ним, и они будут распределены по пространству имен для проекта, класса TestCase, метки времени и метода тестирования. Они автоматически очищаются впоследствии. Вы можете отключить очистку для проверки вывода, установив свойство.
Существует также декоратор, который можно применять к отдельным тестам, если вы постепенно переносите код.