2017-01-24 24 views
2

実行ごとに異なるフィクスチャを使用してテスト関数のコレクションを実行したいとします。一般に、Stack Overflow、ドキュメント、ブログ記事に提案されているソリューションは2つのカテゴリに分類されます。一つは、フィクスチャをパラメータ化することです:Pytest:異なる入力データで複数回テストを実行する

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

他には複数のテストを生成するためにmetafunc.parametrizeを呼び出すことにより、次のとおりです。

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

これらは独立していますが、各データフレームが非常に大きいと想像してください:1つをロードし、すべてのテストを実行し、それを投げ捨て、次のロードをロードしたいなどです。これは数回ロードするのではなく、 、またはテスト中にメモリ内のすべてのデータを保持する。 – instant

答えて

1

データフレームを一度ロードする場合は、scopeパラメータを '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 

テストは交互に実行されますが、データフレームはモジュールまたはセッションごとに1回だけロードされます。

関連する問題