Niestety obecnie nie ma sposobu na ładnie to zrobić. W przyszłości py.test wprowadzi nowy "dowolny" zakres lub coś podobnego do tego, ale taka jest przyszłość.
Teraz musisz zrobić to ręcznie samodzielnie. Jednakże, jak zauważyłeś, tracisz kilka fajnych funkcji: dowiązania symboliczne w/tmp do ostatniego testu, automatyczne czyszczenie po kilku testach, sensownie nazwane katalogi itp. Jeśli katalog nie jest zbyt drogi, zazwyczaj łączę sesję i funkcję o ustalonym zakresie w następujący sposób:
@pytest.fixture(scope='session')
def sessiondir(request):
dir = py.path.local(tempfile.mkdtemp())
request.addfinalizer(lambda: dir.remove(rec=1))
# Any extra setup here
return dir
@pytest.fixture
def dir(sessiondir, tmpdir):
sessiondir.copy(tmpdir)
return tmpdir
to tworzy katalog tymczasowy, który zostanie oczyszczony się po okresie testowym, jednak dla każdego testu, który rzeczywiście potrzebuje go (poprzez zwrócenie dir
) dostaje kopię który jest zapisany z semantyki tmpdir.
Jeśli testy rzeczywiście muszą współdzielić stan za pośrednictwem tego katalogu, to finalizator dir
musiałby skopiować dane z powrotem do sesji. Nie jest to jednak bardzo dobry pomysł, ponieważ sprawia, że testy zależą od kolejności wykonania, a także powodują problemy podczas używania programu pytest-xdist.
Czy my napotkasz żadnych problemów, jeśli po prostu kopiowane z wbudowanej TMPDIR na nową nazwę wtyczki i zakresu to jak chcemy? – ajwood
Prawdopodobnie IIRC nazwa tmpdir zależy od zakresu funkcji i może powodować problemy. Ale nie sprawdziłem, spróbuj, jeśli chcesz! – flub
Od wersji 2.8 już tak nie jest. Zobacz https://stackoverflow.com/a/38050261/384617. –