当使用具有范围会话和类的fixture时,使用范围类的测试运行两次

时间:2015-08-18 14:15:16

标签: python pytest

我有一个下面的py.test程序,我需要2个灯具,一个带范围"会话"和其他范围" class",具有范围的夹具" class"使用" session"作为其中一个论点。

在运行使用范围为" class"的测试时,测试似乎运行了两次,

以下是代码。

import pytest

@pytest.fixture(scope="session")
def session_fixture(request):
    data = ['hello world']
    return data

@pytest.fixture(scope="class")
def class_fixture(session_fixture, request):
    if hasattr(request.cls, 'test1'):
        request.cls().test1(session_fixture)
    return session_fixture

class TestClass:
    def test1(self,class_fixture):
        print("Hello World")

当我进行测试时,它似乎打印了#34; hello world"两次。

输出继电器:

$ py.test test7.py -s
=============== test session start============================
platform linux2 -- Python 2.7.5 -- py-1.4.27 -- pytest-2.7.0
rootdir: /root/fix2, inifile: 
plugins: multihost
collected 1 items 

test7.py Hello World
Hello World
. 
================ 1 passed in 0.09 seconds ===================

在上面的程序中,如果我使用灯具" session_fixture"直接而不是" class_fixture",我看到" Hello world"只打印一次。

有关如何解决问题的任何提示。

1 个答案:

答案 0 :(得分:2)

您的'测试'案例似乎不正确

import pytest

@pytest.fixture(scope="session")
def session_fixture(request):
    data = ['hello world']
    print("Session fixture")
    return data

@pytest.fixture(scope="class")
def class_fixture(session_fixture, request):
    print("Class fixture")
    return session_fixture


class TestClass:
    def test1(self,class_fixture):
        print("Hello World 1")

    def test2(self, class_fixture):
        print('Hello World 2')

这给出了:

py.test test.py -s

collected 2 items 

test.py::TestClass::test1 Session fixture
Class fixture
Hello World 1
PASSED
test.py::TestClass::test2 Hello World 2
PASSED

所以基于类的夹具只执行一次。 Pytest对像这样的简单案例进行了大量的测试覆盖,以确保它始终按照声明的方式工作。