pytest装置范围

时间:2019-02-13 17:56:28

标签: python pytest

很抱歉这个问题。它可能具有重复性,但在Google上找不到与此相关的足够内容。我知道灯具有4个作用域(功能,模块,类,会话)。只想知道这些作用域是否仅在使用autouse true时有效?对于autouse=False,我可以在测试功能中使用具有任何作用域的任何夹具

就像我有一个conftest.py文件一样,其夹具为

@pytest.fixture(scope="module")
def test_fixture():
    DO something
    print "Module level fixture am called"

test.py文件包含以下数据

class ABC:
    def test(test_fixture):
        print "Doing something"
    def test_2(test_fixture):
        print "Executing second test"

现在,如果我将灯具的scope更改为session,它将仍然运行并产生相同的结果。

这意味着作用域仅在autouse=True时有效吗?

1 个答案:

答案 0 :(得分:0)

首先,我需要将您的类重命名为TestABC,以便pytest可以找到它。

第二,我假设您使用的是Python 2,但请记住,pytest 5.0将不再支持它。

我认为这是您的主要问题:由于您使用的是一个类来对测试进行分组,因此,方法的第一个参数始终是实例本身(即self),即使您给它起了另一个名字。

这就是为什么pytest并没有真正检测到您想要通过固定装置,并且永远不会通过。

所以尝试这样的事情:

class TestABC:

    def test(self, test_fixture):
        print "Doing something"

    def test_2(self, test_fixture):
        print "Executing second test"

还请注意,您不需要使用类来对测试进行分组,可以使用常规函数。因此,删除该类也应该可以解决您的问题:

def test(test_fixture):
    print "Doing something"


def test_2(test_fixture):
    print "Executing second test"

另外,在您的情况下,modulesession也会产生类似的效果,因为您只有一个模块(至少在示例中如此)。

但是您可以轻松地将其与默认范围进行比较:如果完全删除范围参数,则在每次需要它的测试之前都会调用一次夹具。

@pytest.fixture
def test_fixture():
    # DO something
    print "Default test level fixture"

使用module将为整个模块调用一次。 session将为所有模块调用一次。

要回答您的原始问题:不,在autouse=False时,范围也适用。