我正在尝试用Pytest创建一个测试环境。其思想是将测试方法分组到类中。
对于每一个类/组,我都希望附加一个将要参数化的config夹具。这样我就可以使用“配置A”运行所有测试,然后使用“配置B”运行所有测试,等等。
而且,我还想要一个reset夹具,它可以在特定方法或类的所有方法之前执行。
我遇到的问题是,一旦我将我的reset config 治具应用于方法或整个类,config夹具似乎在函数作用域中工作,而不是在类作用域中工作。因此,一旦我应用了reset config 工具,就会在类中的每个方法之前/之后调用。。
下面的代码重复了这个问题:
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夹具应该如何工作,只对整个类执行一次。如果取消对usefixtures装饰的注释,您可以注意到config夹具将在每个测试方法中执行。reset 是否可以在不触发这种行为的情况下使用夹具?
发布于 2017-11-23 08:35:30
正如我在评论中提到的,这似乎是Pytest 3.2.5中的一个bug。
有一个解决办法,那就是“强制”参数化的范围。因此,在本例中,如果将scope="class"包含在parametrize装饰器中,则会得到所需的行为。
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):
passhttps://stackoverflow.com/questions/47312835
复制相似问题