【发布时间】:2016-03-08 13:07:03
【问题描述】:
我的 conftest.py 中有以下代码
import pytest
@pytest.fixture(scope="class")
def fix1():
print("i am in fix1")
a = 10
return a
@pytest.fixture(scope="class")
def fix2():
print("i am in fix2")
b = 20
return b
@pytest.fixture(scope="session",autouse=True)
def setup_session(request):
tp = TestSetup(fix1)
tp.setup()
def teardown_session():
tp.teardown()
request.addfinalizer(teardown_session)
class TestSetup(object):
def __init__(self, fix1, fix2):
self.fix1 = fix1
self.fix2 = fix2
def setup(self):
print("i am in setup")
print(self.fix1)
def teardown(self):
print("I am in teardown")
print(self.fix2)
# py.test -s test1.py
=========== test session starts ===========
platform linux2 -- Python 2.7.5, pytest-2.8.5, py-1.4.31, pluggy-0.3.1
rootdir: /tmp/test, inifile:
collected 2 items
test1.py i am in setup
<function fix1 at 0x2948320>
i am in test1
.i am in test2
.I am in teardown
当我使用 pytest 执行上述操作时,永远不会调用固定装置 fix1 和 fix2。在我的任何测试运行之前,我需要一种方法来调用 fix1 和 fix2 作为设置和拆卸的一部分。
我想要实现的是在我的任何测试运行之前,我需要创建一个设置,fix1 和 fix2 是设置一些东西的夹具。我想在我的任何测试运行之前调用这些夹具,一旦所有测试都运行,我调用 teardown 函数来拆除我的设置。
【问题讨论】:
-
当你在
setup_session函数中使用fix1时,你不是传递了fixture,而是传递了fixture 的工厂函数(def fix1(): ...)。要真正使用夹具,您必须将其声明为setup_session函数的参数。但是,这将导致错误:ScopeMismatch: You tried to access the 'class' scoped fixture 'fix1' with a 'session' scoped request object,。 您能告诉我们您想要达到什么目标,以及为什么要这样做,因为在我看来,您是在尝试将另一种测试风格硬塞到 py.test 中。 -
@EzequielMuns 我想要实现的是在我的任何测试运行之前,我需要创建一个设置,fix1 和 fix2 是设置一些东西的夹具。我想在我的任何测试运行之前调用这些夹具,一旦所有测试都运行,我调用 teardown 函数来拆除我的设置。