2017-01-24 95 views
2

我想運行一組測試函數,每次運行使用不同的燈具。通常,堆棧溢出,文檔和博客文章中提出的解決方案分爲兩類。其一是通過參數化夾具:由以產生多個測試呼叫metafunc.parametrizePytest:使用不同的輸入數據多次運行測試

@pytest.fixture(params=list_of_cases) 
def some_case(request): 
    return request.param 

另一種是:

def pytest_generate_tests(metafunc): 
    metafunc.parametrize('some_case', list_of_cases) 

用這兩種方法的問題是在這情況下的運行順序。基本上它使用每個參數運行每個測試函數,而不是通過給定參數的所有測試函數,然後繼續下一個參數。這是一個問題,當我的一些設備是比較昂貴的數據庫調用。

爲了說明這一點,假定dataframe_x是屬於case_x的另一個燈具。 Pytest做到這一點

test_01(dataframe_1) 
test_01(dataframe_2) 
... 
test_50(dataframe_1) 
test_50(dataframe_2) 

,而不是

test_01(dataframe_1) 
... 
test_50(dataframe_1) 

test_01(dataframe_2) 
... 
test_50(dataframe_2) 

的結果是,我會從DB 50倍,而不是隻取一次,每個數據集。由於我只能將燈具範圍定義爲'會話','模塊'或'功能',所以我無法弄清楚如何將我的測試分組到一起,以塊爲單位。

有沒有一種方法來組織我的測試,以便我可以順序運行每個數據集的所有測試函數?

+0

爲什麼你想讓你的測試在塊中執行?您的測試是否需要按順序運行?如果是這樣,我認爲這並不理想,因爲每個測試應該能夠獨立運行。 – Cedric

+0

它們是獨立的,但想象每個數據幀都非常大:我想加載一個,執行所有測試,將它扔掉,加載下一個,等等。這對我來說更直觀,而不是加載它幾次或者在整個測試過程中將所有數據保存在內存中。 – instant

回答

1

如果您只希望加載數據幀,只要將範圍參數與'module'或'session'一起使用即可。

@pytest.fixture(scope="module", params=[1, 2]) 
def dataframe(request): 
    if request.param == 1: 
     return #load datagrame_1 
    if request.param == 2: 
     return #load datagrame_2 

測試仍將交替運行,但數據幀只會在每個模塊或會話中加載一次。

相關問題