2016-11-12 26 views
0

按照该pytest documentation,可以覆盖默认的临时目录设置如下:如何动态地更改pytest的TMPDIR基本目录

py.test --basetemp=/base_dir 

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

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

...像下面将被打印在屏幕上:

/base_dir/test_new_base_dir_0 

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

不过,我想能够改变在每个测试(或者我应该说“每灯具”)依据此设置。这样的事情可能吗?

我亲近的只是我自己的滚动tmpdir基础上,code for the original,但宁愿不做这个 - 我想建立在现有的功能,在那里我可以,不能重复它的上面。


顺便说一句,我的特定用途的情况是,我写一个Python模块,将不同类型的文件系统(NFS4等)的行动,这将是很好的能够产生功能的tmpdir能够创建以下夹具:

def test_nfs3_stuff(nfs3_tmpdir): 
    ... test NFS3 functionality 

def test_nfs4_stuff(nfs4_tmpdir): 
    ... test NFS4 functionality 

回答

0

似乎没有成为一个很好的解决方案,以作为问题提出的问题,所以我看中了两次呼叫py.test

  • 传递一个不同--basetemp每个。
  • 标记(使用@pytest.mark.my_mark),该测试所需使用非标准basetemp的特殊处理。
  • 传递-k my_mark-k-my_mark到每个呼叫。
0

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 

-

>set PYTEST_TMPDIR=./tmp 
>python.exe -m pytest -q -s test_my_db.py 
* c:\tests\tmp\data1_0\db1.db 
.* c:\tests\tmp\data2_0\db2.db 
. 
2 passed in 10.03 seconds