2017-03-07 68 views
12

我在使用py.test運行測試時使用joblib.Memory來緩存昂貴的計算。我正在使用的代碼還原爲以下,在py.test運行後刪除緩存的文件

from joblib import Memory 

memory = Memory(cachedir='/tmp/') 

@memory.cache 
def expensive_function(x): 
    return x**2 # some computationally expensive operation here 

def test_other_function(): 
    input_ds = expensive_function(x=10) 
    ## run some tests with input_ds 

它工作正常。我知道這可能會更優雅地與tmpdir_factory夾具完成,但那不是重點。

我遇到的問題是如何清除緩存文件,一旦所有的測試運行,

  • 是可以共享所有測試中一個全局變量(它將包含如路徑到列表緩存的對象)?
  • 在py.test中是否有一種機制在所有測試運行後調用某個命令(無論它們是否成功)?

回答

8

是可以共享所有測試中一個全局變量(它將包含例如一個路徑列表緩存對象)?

我不會走那條路。全局可變狀態最好避免,特別是在測試中。

在py.test中是否有一種機制在所有測試運行後調用某些命令(無論它們是否成功)?

是,添加自動使用會話範圍固定到您的項目級conftest.py文件:

# conftest.py 
import pytest 

@pytest.yield_fixture(autouse=True, scope='session') 
def test_suite_cleanup_thing(): 
    # setup 
    yield 
    # teardown - put your command here 

後的收益率將要運行的代碼 - 一次 - 在測試套件結束,無論通過還是失敗。

+1

謝謝,這就是我一直在尋找。同意你關於測試中的全局變量.. – rth

2

是否有可能在所有測試中共享全局變量(其中 包含例如緩存對象的路徑列表)?

實際上有幾種方法可以做到這一點,每種方法都有優點和缺點。我覺得這個答案的SO概括起來相當不錯 - https://stackoverflow.com/a/22793013/3023841 - 但是,例如:

def pytest_namespace(): 
    return {'my_global_variable': 0} 

def test_namespace(self): 
    assert pytest.my_global_variable == 0 

有在py.test一種機制來調用一些命令,一旦所有的測試運行(無論成功與否)?

是的,py.test有可用teardown功能:

def setup_module(module): 
    """ setup any state specific to the execution of the given module.""" 

def teardown_module(module): 
    """ teardown any state that was previously setup with a setup_module 
    method. 
    """ 
+0

感謝您的迴應。我想我會用另一種解決方案,但這絕對是有用的信息。我不知道模塊級別的拆卸功能。 – rth