如何使用 xunit 风格的 setup_function

Ane*_*pic 4 python pytest

文档说:

如果您更愿意直接在模块级别定义测试函数,您还可以使用以下函数来实现夹具:

def setup_function(function):
    """ setup any state tied to the execution of the given function.
    Invoked for every test function in the module.
    """

def teardown_function(function):
    """ teardown any state that was previously setup with a setup_function
    call.
    """
Run Code Online (Sandbox Code Playgroud)

但实际上不清楚你应该如何使用它们。

我尝试将它们完全如上所示放入我的测试文件中,但它们没有被调用。仔细观察它们,使用该function参数,它们看起来像装饰器。所以我试图找到一种方法:

@pytest.setup_function
def my_setup():
    # not called
Run Code Online (Sandbox Code Playgroud)

不过,我找不到任何地方可以从中导入一个装饰器,所以这是不对的。

在 grokbase上找到了这个帖子,有人解释说你可以这样做:

 @pytest.fixture(autouse=True)
 def setup_function(request):
     # this one gets called
Run Code Online (Sandbox Code Playgroud)

它有效,但它似乎不再与文档相关......没有理由在setup_function这里调用它。

Ant*_*hon 5

您只需实现 的主体setup_function(),为名称以 开头的每个函数调用test_该函数,并将该函数作为参数传递:

def setup_function(fun):
    print ("in setup function: " + fun.__name__)

def test_test():
    assert False
Run Code Online (Sandbox Code Playgroud)

这将作为输出,运行时py.test

============================= test session starts ==============================
platform linux2 -- Python 2.7.6 -- pytest-2.3.5
collected 1 items 

test/test_test.py F

=================================== FAILURES ===================================
__________________________________ test_test ___________________________________

    def test_test():
>       assert False
E       assert False

test/test_test.py:7: AssertionError
------------------------------- Captured stdout --------------------------------
in setup function: test_test
=========================== 1 failed in 0.01 seconds ===========================
Run Code Online (Sandbox Code Playgroud)

最后一行之前的行显示了实际调用的输出 setup_function()

一个稍微有用的例子,实际上做了一些影响测试功能的事情:

def setup_function(function):
    function.answer = 17

def teardown_function(function):
    del function.answer

def test_modlevel():
    assert modlevel[0] == 42
    assert test_modlevel.answer == 17
Run Code Online (Sandbox Code Playgroud)

这是摘自py.test自己的测试,总是一个好(希望完成)设置的所有功能的例子py.test