gpt4 book ai didi

python - 使用 pytest 动态参数化类级固定装置

转载 作者:行者123 更新时间:2023-11-28 20:28:49 24 4
gpt4 key购买 nike

可以从命令行参数参数化测试函数。可以将 fixture 限定为一个类。我想将这两件事结合起来,以便每个类都接收在类中提供给固定装置的参数化参数。

(本质上,每个命令行参数我需要运行一个非常昂贵的操作,然后针对该操作的结果进行各种廉价、快速的测试,我不希望不必重新运行昂贵的操作每个便宜的测试,所以我想要一种保存它的方法)

换句话说,我正在寻找与 pytest_generate_tests(metafunc) 等效的方法,它可以用于动态参数化 fixture ,而不是测试函数。

我已经尝试过的一件事是读取请求参数并通过 pytest_generate_tests Hook 设置那些

conftest.py:
def pytest_generate_tests(metafunc):
metafunc.parametrize("result", [
(1,0),(1,2)
])

test_thing.py:
class TestThingy:
@pytest.fixture(scope="class")
def result(self, request):
a,b=request.param
return a+b

#@pytest.mark.parametrize("result", [(0, 1), (1, 2)])
def test_one(self, result):
assert result!=2

运行此测试会引发以下错误(请注意,当我在没有 conftest Hook 且未注释注释行的情况下尝试时,测试运行良好):

@pytest.fixture(scope="class")
def result(self, request):
a,b=request.param

AttributeError: 'SubRequest' object has no attribute 'param'

我也对实现相同结果的任何其他替代方法感兴趣。

最佳答案

我做了一个丑陋的 hack-of-a-job 参数化基于命令行 args 的 fixture ,如下所示:

# contents of conftest.py
import pytest

def pytest_addoption(parser):
parser.addoption("--test-local", action="store_true", default=False)

def pytest_generate_tests(metafunc):
if "dummy" in metafunc.fixturenames:
#driverParams sets dummy[0], dummy[1] parametrically (as seen below)
if metafunc.config.getoption("--test-local"):
driverParams = [(True, None)]
else:
driverParams = [(False, "seriousface setting 1"),
(False, "seriousface setting 2")]
metafunc.parametrize("dummy", driverParams)

#driver can then be used as a standard fixture
@pytest.fixture(scope="function")
def driver(dummy):
_driver = makeDriverStuff(dummy[0], dummy[1])
yield _driver
_driver.cleanup()

@pytest.fixture(scope="function")
def dummy():
pass

本质上,这里发生的事情是当 metafunc.parametrize("dummy", driverParams) 运行时,它会将 driverParams 扔到任何依赖于虚拟 fixture 的东西中。更重要的是,这意味着虚拟 fixture 函数永远不会真正执行

最初,我尝试使用 metafunc 直接参数化我的驱动 fixture ,并注意到清理从未发生,因为我之前做事的(错误)方式是 metafunc.parametrizemakeDriverStuff(param1, param2) 直接,然后抓耳挠腮想知道为什么 driver() 从未被调用过。假人的要点是说,“嘿,这里有一个合法的固定装置,不要提示你找不到它!”,然后总是用实际有用的东西抢占它。

就像我说的,这是一个丑陋的 hack。但是你应该能够适应它

关于python - 使用 pytest 动态参数化类级固定装置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39686269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com