如何强制Pytest执行parameterize中的唯一函数



我有两个测试。我想运行唯一一个:

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中的每个函数都会更改相同测试数据的状态。

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

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。

在运行所有参数化实例之前,是否有一种方法可以唯一一次运行fixture(或任何其他函数(进行参数化测试?

看起来只有这样的东西才能解决问题。

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)

最新更新