Python中pytest参数化的一个问题,求大佬指点
有个不太正经的问题,俩个测试函数有依赖( test_equals )( test_zerodivision ), 我想在执行 test_equals 后修改 test_zerodivision 的入参,但是 pytest_generate_tests 已经根据 param 把这个入参给生成好了。有什么办法在执行了 test_equal 后然后修改 param 重新执行 pytest_generate_tests,或者直接修改 pytest_generate_tests 生成的入参(但是我实在找不到这个东西在哪里修改,他这个黑魔法方法,太玄幻)。
(我有办法避免这个问题,就是拆开来,但是我还是想知道下,能不能直接修改这个值,或者执行的过程中 reload 这个 class 的 param,重新生成参数)
# doc 地址 https://docs.pytest.org/en/latest/example/parametrize.html#paramexamples
import pytest
def pytest_generate_tests(metafunc):
# called once per each test function
funcarglist = metafunc.cls.params[metafunc.function.name]
argnames = sorted(funcarglist[0])
metafunc.parametrize(argnames, [[funcargs[name] for name in argnames]
for funcargs in funcarglist])
class TestClass(object):
# a map specifying multiple argument sets for a test method
params = {
‘test_equals’: [dict(a=1, b=2), dict(a=3, b=3), ],
‘test_zerodivision’: [dict(a=1, b=0), ],
}
#现在我想执行了这个函数把 ‘test_zerodivision’: [dict(a=1, b=0), ]改成 ‘test_zerodivision’: [dict(a=1, b=1), ]
def test_equals(self, a, b):
assert a == b
def test_zerodivision(self, a, b):
with pytest.raises(ZeroDivisionError):
a / b
Python中pytest参数化的一个问题,求大佬指点
我无法理解你的问题
逛 V2EX 第一次遇到测试相关的话题
是 pytest 这个框架的黑魔法啊,他执行每个测试函数的时候 都会先执行一大堆 hook 函数,然后把参数用**kwarg 的方法传给测试函数,我现在就是想知道 怎么拿到内存中的那一堆生成的参数 ,然后偷偷修改掉
代理拦截的黑魔法我就不懂了,pytest 支持插件,我看很多插件轮子里面都用上钩子了,可以看看它的插件机制支持不
按我的理解pytest_generate_tests是重新收集测试用例了,这个应该是不推荐或者不允许的。
换个角度看,正常开始测试之前我收集了 2 条 case,但是代码里再动态添加了 1 个,那最终的测试结果该是 2 个还是 3 个呢?
如果是两个 case 之间共享数据,应该自定义一个 fixture 就可以了。
自己设置一个全局变量应该可以做到


