问题:在将我的代码从 pytest v3.0.7 升级到 v6.2.4 时,我遇到了功能问题。这意味着,v6.x 中的代码行为与 v3.x 中的代码行为不同。pytest v3.x 和 v6.x 中的fixture范围不一样
此问题背后的原因:在最新的 pytest 版本中,pytest 固定装置范围的工作方式发生了变化。早些时候,在 v3.x 中,我看到函数作用域在会话作用域被允许之前被执行。但是,在 v6.x 中,会话范围严格在函数范围之前执行。参考1和参考2
因此,升级 pytest 版本后,我的代码功能已经完全改变。作为一个遗留的测试框架,我不能那么容易地交换范围,因为很多插件/依赖代码会显示出意外的行为。
是否有任何解决方法可以保持执行与以前相同?所以,基本上我希望函数作用域在 v6.x 的 pytest 固定装置内的会话作用域之前执行。
例如,
import pytest
a = []
@pytest.fixture(scope="session")
def a_o():
a.append('1')
@pytest.fixture(scope="function")
def b_o():
a.append('2')
def test_order(b_o, a_o):
assert a == ["2", "1"]
使用 pytest v.3.0.7 执行上述代码时,将断言 True(测试通过)。但是,对于 pytest v6.2.4,它会抛出一个错误,因为范围为“会话”的固定装置将首先执行,然后是范围为“功能”的固定装置。现在,我想要一种解决方法或修复方法,使测试将在与 pytest v6.2.4 相同的场景中通过,并且由于前面提到的原因,我无法更改范围。