当一个参数由另一个参数生成时,pytest的两个参数化级别



我有一个参数列表的方案。每个参数都可以生成另一个参数列表,我想基于两个参数参数化测试。

类似于我在下面使用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

我怀疑是否有直接的方法来实现这一目标。但是通过扩展Pytest插件pytest_generate_tests,我们可以做到。

这是我关于另一个parametrize问题的答案。使用夹具返回值作为mark.parametrize()

中的值

这是我的解决方案。

  1. 标记要进行两个级别参数化的测试。
  2. 获取要进行两个级别参数化的测试,并获得第一个级别的参数化。
  3. 基于第一级参数化,生成第二级。
  4. 分配的测试案例仅使用第二级参数化或根据您的要求同时使用。

示例测试:

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

相关内容

  • 没有找到相关文章

最新更新