3

パラメータリストがあるシナリオがあります。この各パラメーターは別のパラメーター リストを生成することができ、両方のパラメーターに基づいてテストをパラメーター化したいと考えています。

以下で行っていることと似ていfor loopますが、パラメーター化を使用しています。またtest_1test_2パラメータの任意のセットに対して一緒に実行する必要があります

何か助けて??

param1 = [<some_list>]
#param2 = [<some_list_Generated_based_on_Param1>]

for arg1 in param1:
    param2 = get_param2(arg1)
    for arg2 in param2
        def test_1():
            ...
            pass
        def test_2():
            ...
            pass
4

1 に答える 1

1

それを達成する直接的な方法があるかどうかは疑問です。しかし、 pytest plugin を拡張するpytest_generate_testsことで、それを行うことができます。

これは別のparametrize質問に対する私の答えです。mark.parametrize() の値としてフィクスチャの戻り値を使用する

これが私の解決策です。

  1. 2 レベルのパラメーター化を実行するテストをマークします。
  2. 2 レベルのパラメーター化を行うテストを取得し、最初のレベルのパラメーター化を取得します。
  3. 第 1 レベルのパラメーター化に基づいて、第 2 レベルを生成します。
  4. 割り当てられたテスト ケースは、要件に応じて、第 2 レベルのパラメーター化のみを使用するか、両方を使用します。

テスト例:

import pytest

@pytest.mark.two_level_parametrization
@pytest.mark.parametrize("first_level", [1, 2, 3])
def test_two_level_parametrization(second_level):
    print(second_level)

Conftest.py:

import pytest

def pytest_generate_tests(metafunc):
    if hasattr(metafunc.function, 'two_level_parametrization'):
        # You may need more marker or add if statement based on the arg of parametrize if you want to implement multiple two-level paremetrize
        first_parametrize = metafunc.function.parametrize
        metafunc.function.parametrize = [calculate_second_parametrize(first_parametrize)]

        # # If you want to keep first level parametrization:
        # metafunc.function.parametrize = [first_parametrize, calculate_second_parametrize(first_parametrize)]

def calculate_second_parametrize(first_parametrize):
    # Define your own method here to generate the parametrize object you need.

    input_params = first_parametrize.args[1]
    output_params = input_params + [-1 * num for num in input_params]
    return pytest.mark.parametrize('second_level', output_params)

出力:

test_01.py::test_two_level_parametrization[1] 1
PASSED
test_01.py::test_two_level_parametrization[2] 2
PASSED
test_01.py::test_two_level_parametrization[3] 3
PASSED
test_01.py::test_two_level_parametrization[-1] -1
PASSED
test_01.py::test_two_level_parametrization[-2] -2
PASSED
test_01.py::test_two_level_parametrization[-3] -3
PASSED
于 2016-06-25T18:36:58.613 に答える