带有作用域“类”的 Pytest 夹具在每个方法上运行

Gus*_*ira 5 python pytest

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

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

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

reset遇到的问题是,一旦我将我的夹具(应用于方法或整个类),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
Run Code Online (Sandbox Code Playgroud)

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

Gus*_*ira 6

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

有一种解决方法,即“强制”参数化的范围。因此,在这种情况下,如果您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):
        pass
Run Code Online (Sandbox Code Playgroud)