如何强制Pytest执行参数化中的唯一功能?

How to force Pytest to execute the only function in parametrize?

我有 2 个测试。我要运行唯一一个:

pipenv run pytest -s tmp_test.py::test_my_var

但是pytest在@pytest.mark.parametrize中执行了两个函数(在两个测试中)

如果我 运行 唯一的 test_my_var,我如何强制 Pytest 执行唯一的 get_my_var() 函数?

如果我 运行 整个文件:

pipenv run pytest -s tmp_test.py

我希望 Pytest 按以下方式执行代码:

get_my_var()
test_my_var()
get_my_var_1()
test_my_var_1()

实际上,我在@pytest.mark.parametrize 中的函数进行了一些数据准备,并且两个测试都使用相同的实体。所以@pytest.mark.parametrize中的每个函数都会改变同一个测试数据的状态。

这就是为什么我强烈需要 运行ning 参数化函数在相应测试之前的顺序。

def get_my_var():
    with open('my var', 'w') as f:
        f.write('my var')
    return 'my var'


def get_my_var_1():
    with open('my var_1', 'w') as f:
        f.write('my var_1')
    return 'my var_1'


@pytest.mark.parametrize('my_var', get_my_var())
def test_my_var(my_var):
    pass


@pytest.mark.parametrize('my_var_1', get_my_var_1())
def test_my_var_1(my_var_1):
    pass

或者我怎样才能通过任何其他选项实现相同的目标?

例如,固定装置。我可以使用夹具进行数据准备,但我需要在不同的测试中使用相同的夹具,因为准备工作是相同的。所以我不能使用 scope='session'.

同时 scope='function' 为参数化测试的每个实例生成 fixture 运行s。

有没有办法 运行 在所有参数化实例的 运行 秒之前固定(或任何其他函数)唯一一次参数化测试?

看来只有这样才能解决问题。

import pytest

current_test = None


@pytest.fixture()
def one_time_per_test_init(request):
    test_name = request.node.originalname
    global current_test
    if current_test != test_name:
        current_test = test_name
        init, kwargs = request.param
        init(**kwargs)