2012-12-18 12 views
9

私は2つの簡単なテスト設定を持っています。私はそれらを1つのフィクスチャー にグループ化しようとしています。そして、テスト関数をフィクスチャに 'params'で渡したいと思います。pytestフィクスチャに渡されたパラメータを変数として渡すことはできますか?

ここに私の質問を説明するための人為的な例があります。 は、私は、次のpytest器具を持って言う:上記のparamsをtest_madeup関数への入力として渡されるように

@pytest.fixture(scope="module", params=['param1','param2']) 
def myFixture(request): 
    if request.param == 'param1': 
     p = 5 
    elif request.param == 'param2': 
     p = 10 
    return p 

# would like to set request.param = ['param1'] for myFixture 
def test_madeup(myFixture): 
    assert myFixture == 5 

# would like to set request.param = ['param2'] for myFixture 
def test_madeup2(myFixture): 
    assert myFixture == 10 

は、私はそれを作ることはできますか? ので、以下のようなもの:

@pytest.fixture(scope="module", params=fixtureParams) 
def myFixture(request): 
    if request.param == 'param1': 
     return 5 
    elif request.param == 'param2': 
     return 10 


def test_madeup(myFixture, ['param1']): 
    assert myFixture == 5 

上記は、当然のことながら、動作しません。実際のケースはもう少し複雑です。 test_madeup機能からparams=['param1','param2'] をフィクスチャに渡すことができるかどうかを知りたいだけです。

答えて

14

私が正しくあなたの質問を理解していれば、あなたは基本的に実行するためのパラメータ化の固定具の1つのインスタンスを選択しますテストにいくつかの情報を提供することで、テストを行います。おそらくメカニズムについて考えることはできますが、不可能です。 test_allが両方の固定具を2回実行されるので、これは、4つのテストを実行します

import pytest 

@pytest.fixture(scope="module") 
def myFixture1(): 
    return 5 

@pytest.fixture(scope="module") 
def myFixture2(): 
    return 2 

@pytest.fixture(scope="module", params=["param1", "param2"]) 
def myFixture(request): 
    if request.param == 'param1': 
     return request.getfuncargvalue("myFixture1") 
    elif request.param == 'param2': 
     return request.getfuncargvalue("myFixture2") 

def test_1(myFixture1): 
    assert myFixture1 == 5 

def test_2(myFixture2): 
    assert myFixture2 == 2 

def test_all(myFixture): 
    assert myFixture in (2,5) 

:私は、次の解決策は、あなたの全体の問題にマップするが、ここでは上記の具体的なケースを解決する一つの方法であるかどうかわからないです。

フィクスチャの設定が重くない場合は、リストを生成するフィクスチャと、パラメータ化された「反復」フィクスチャを持つこともできます。テストによって、リスト全体を取得し、リストにインデックスを付けることができます。

3

ないこれが何をしたいですが、例の場合は次のように実装することができるかどうかを確認します。

@pytest.mark.parametrize(('param', 'expected'), [('param1', 5), ('param2', 10)]) 
def test_madeup(param, expected): 
    assert param == expected 
関連する問題