pytest夹具不起作用 - 为什么?
问题描述:
我想使用PyTest,我无法获得如何设置灯具。我试过下面的代码:pytest夹具不起作用 - 为什么?
import pytest
import random
@pytest.fixture()
def setup():
a = random.randint(0,10)
def test(setup):
assert 3 > a
if __name__ == '__main__':
pytest.main()
而且我越来越"NameError: name 'a' is not defined".
而且例如,从官方文档不起作用。怎么了?我需要功能类似于setUp/tearDown。但我不想使用单元测试。有人能给我提供一个工作夹具的例子(setUp类型和tearDown类型)吗?我想写一些测试作为函数和一些测试作为类内的方法,因此我的第二个问题是使用具有类/方法的fixture的工作示例。我只需要在python中查看fixtures的工作示例。
是否与断言简单不同python3单元测试框架为PyTest?
答
灯具不能这样工作。他们不能神奇地将名称a
从一个功能的(setup
)本地范围转移到另一个(test
)。相反,您的setup
函数必须显式返回将作为setup
参数传递给您的test
函数的对象。例如:
import pytest
import random
class TestSetup:
def __init__(self):
self.a = random.randint(0, 10)
@pytest.fixture()
def setup():
return TestSetup()
def test(setup):
assert 0 <= setup.a <= 10
if __name__ == '__main__':
pytest.main()
谢谢** Vasiliy **。有没有更简单的方法来设置/ tearDown pytest?更容易我的意思是减少打字。我尝试在灯具中定义变量并将其返回,但它不起作用。我真的不想为此定义额外的类。任何意见将是有益的。还有,是否有另一个单元测试框架,其断言以pytest中的语句定义?我想尽可能少写:)再次感谢。 – 2014-09-13 16:20:11
@ master.py如果你只需要一个变量(在这种情况下为'a'),只需从'setup()'返回它。然后,在'test()'里面,'setup'参数的值就是你返回的值,所以你可以写:'assert 0 2014-09-13 16:22:18
** Vasiliy **!有用。这很简单。我被文档弄糊涂了。我有两个更多的好处要问。你能告诉我如何以类似的方式设置tearDown - 我读过文档,我不知道:(以及如何为所有测试设置默认的setUp和tearDown,而不需要明确地加入像'def test(setup)':' – 2014-09-13 16:31:04