如何动态更改pytest的tmpdir基本目录

时间:2016-11-12 19:49:34

标签: python pytest temporary-files

根据pytest documentation,可以覆盖默认的临时目录设置,如下所示:

py.test --basetemp=/base_dir

然后在测试中使用tmpdir夹具......

def test_new_base_dir(tmpdir):
    print str(tmpdir)
    assert False

......然后将以下内容打印到屏幕上:

/base_dir/test_new_base_dir_0

这可以按预期工作,对于某些用例可能非常有用。

但是,我希望能够在每次测试(或者我应该说" per-fixture")的基础上更改此设置。这样的事情可能吗?

我接近于仅根据code for the original滚动自己的tmpdir,但我宁愿不这样做 - 我希望尽可能在现有功能的基础上构建,而不是复制它。

顺便说一下,我的特殊用例是我正在编写一个Python模块,它将作用于不同类型的文件系统(NFS4等),能够产生{{1的功能能够创建以下灯具:

tmpdir

2 个答案:

答案 0 :(得分:0)

在问题中提出的问题似乎没有一个很好的解决方案,所以我决定拨打py.test的两个电话:

  • 为每个人传递不同的--basetemp
  • 标记(使用@pytest.mark.my_mark)哪些测试需要使用非标准basetemp的特殊处理。
  • -k my_mark-k-my_mark传递给每个电话。

答案 1 :(得分:0)

xs的来源中,TempdirFactory用作存储.config.option.basetemp的属性。所以你可以在使用之前直接设置它:

basetemp

-

import pytest
import time
import os

def mktemp_db(tmpdir_factory, db):
    basetemp = None
    if 'PYTEST_TMPDIR' in os.environ:
        basetemp = os.environ['PYTEST_TMPDIR']
    if basetemp:
        tmpdir_factory.config.option.basetemp = basetemp
    if db == "db1.db":
        tmpdb = tmpdir_factory.mktemp('data1_').join(db)
    elif db == "db2.db":
        tmpdb = tmpdir_factory.mktemp('data2_').join(db)
    return tmpdb

@pytest.fixture(scope='session')
def empty_db(tmpdir_factory):
    tmpdb = mktemp_db(tmpdir_factory, 'db1.db')
    print("* " + str(tmpdb))
    time.sleep(5)
    return tmpdb

@pytest.fixture(scope='session')
def empty_db2(tmpdir_factory):
    tmpdb = mktemp_db(tmpdir_factory, 'db2.db')
    print("* " + str(tmpdb))
    time.sleep(5)
    return tmpdb

def test_empty_db(empty_db):
    pass

def test_empty_db2(empty_db2):
    pass