gpt4 book ai didi

python - 范围为 "class"的 Pytest fixture 在每个方法上运行

转载 作者:行者123 更新时间:2023-11-28 22:23:01 33 4
gpt4 key购买 nike

我正在尝试使用 Pytest 创建测试环境。这个想法是将测试方法分组到类中。

对于每个类/组,我想附加一个将被参数化的 config fixture 。这样我就可以使用“配置 A”运行所有测试,然后使用“配置 B”运行所有测试,依此类推。

而且,我想要一个reset fixture ,它可以在特定方法或类的所有方法之前执行。

我遇到的问题是,一旦我应用了我的reset fixture(到一个方法或整个类),config fixture 似乎工作了在函数范围内而不是类范围内。因此,一旦我应用了 reset fixture,就会在类中的每个方法之前/之后调用 config fixture。

下面的一段代码重现了这个问题:

import pytest
from pytest import *

@fixture(scope='class')
def config(request):
print("\nconfiguring with %s" % request.param)
yield
print("\ncleaning up config")

@fixture(scope='function')
def reset():
print("\nreseting")

@mark.parametrize("config", ["config-A", "config-B"], indirect=True)
#@mark.usefixtures("reset")
class TestMoreStuff(object):

def test_a(self, config):
pass

def test_b(self, config):
pass

def test_c(self, config):
pass

测试展示了config fixture 应该如何工作,整个类只执行一次。如果取消注释 usefixtures 装饰,您会注意到 config fixture 将在每个测试方法中执行。 是否可以在不触发此行为的情况下使用reset fixture?

最佳答案

正如我在评论中提到的,这似乎是 Pytest 3.2.5 中的错误。

有一个解决方法,即“强制”参数化的范围。因此,在这种情况下,如果您在 parametrize 装饰器中包含 scope="class",您将获得所需的行为。

import pytest
from pytest import *

@fixture(scope='class')
def config(request):
print("\nconfiguring with %s" % request.param)
yield
print("\ncleaning up config")

@fixture(scope='function')
def reset():
print("\nreseting")

@mark.parametrize("config", ["config-A", "config-B"], indirect=True, scope="class")
@mark.usefixtures("reset")
class TestMoreStuff(object):

def test_a(self, config):
pass

def test_b(self, config):
pass

def test_c(self, config):
pass

关于python - 范围为 "class"的 Pytest fixture 在每个方法上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47312835/

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