2014-09-13 106 views
2

我想使用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

回答

5

灯具不能这样工作。他们不能神奇地将名称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() 
+0

谢谢** Vasiliy **。有没有更简单的方法来设置/ tearDown pytest?更容易我的意思是减少打字。我尝试在灯具中定义变量并将其返回,但它不起作用。我真的不想为此定义额外的类。任何意见将是有益的。还有,是否有另一个单元测试框架,其断言以pytest中的语句定义?我想尽可能少写:)再次感谢。 – 2014-09-13 16:20:11

+0

@ master.py如果你只需要一个变量(在这种情况下为'a'),只需从'setup()'返回它。然后,在'test()'里面,'setup'参数的值就是你返回的值,所以你可以写:'assert 0 <= setup <= 10'。 – 2014-09-13 16:22:18

+0

** Vasiliy **!有用。这很简单。我被文档弄糊涂了。我有两个更多的好处要问。你能告诉我如何以类似的方式设置tearDown - 我读过文档,我不知道:(以及如何为所有测试设置默认的setUp和tearDown,而不需要明确地加入像'def test(setup)':' – 2014-09-13 16:31:04