10

2つの簡単なテスト設定があり、それらを1つのフィクスチャにグループ化しようとしており、テスト関数がフィクスチャに「params」を渡してほしいと思っています。

これが私の質問を説明するための工夫された例です。私が次のpytestフィクスチャを持っているとしましょう:

@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

test_madeup上記のパラメータが関数への入力として渡されるようにすることはできますか?したがって、次のようなものです。

@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

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

4

2 に答える 2

15

私があなたの質問を正しく理解していれば、基本的に、テストでいくつかの情報を提供することにより、テストで実行するパラメータ化されたフィクスチャの 1 つのインスタンスを選択する必要があります。メカニズムは考えられるかもしれませんが、それは不可能です。次の解決策が問題全体に当てはまるかどうかはわかりませんが、上記の具体的なケースを解決する 1 つの方法を次に示します。

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)

これはtest_all、両方のフィクスチャで が 2 回実行されるため、4 つのテストを実行します。

フィクスチャのセットアップが重くない場合は、リストを生成する 1 つのフィクスチャと「反復」パラメータ化されたフィクスチャもあるかもしれません。次に、テストでリスト全体を取得し、それにインデックスを付けることができます。

于 2012-12-18T14:13:53.227 に答える
4

これがあなたが望むものかどうかはわかりませんが、例のケースは次のように実装できます:

@pytest.mark.parametrize(('param', 'expected'), [('param1', 5), ('param2', 10)])
def test_madeup(param, expected):
    assert param == expected
于 2012-12-18T12:39:04.650 に答える