我怀疑是否有直接的方法可以实现这一目标。但是通过扩展 pytest 插件pytest_generate_tests
,我们可以做到。
这是我对另一个parametrize
问题的回答。使用夹具返回值作为 mark.parametrize() 中的值
这是我的解决方案。
- 标记要进行两级参数化的测试。
- 获取要进行二级参数化的测试,并获取一级参数化。
- 基于第一级参数化,生成第二级。
- 分配的测试用例仅使用二级参数化或根据您的要求同时使用。
示例测试:
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