Question

The docs say:

If you would rather define test functions directly at module level you can also use the following functions to implement fixtures:

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.
    """

but actually it's unclear how you're supposed to use them.

I tried putting them in my test file exactly as shown above, but they don't get called. Looking closer at them, with that function arg they look like decorators. So I tried to find a way to do:

@pytest.setup_function
def my_setup():
    # not called

I couldn't find anywhere to import one from as a decorator though, so that can't be right.

I found this thread on grokbase where someone explains you can do:

 @pytest.fixture(autouse=True)
 def setup_function(request):
     # this one gets called

It works, but it doesn't seem related to the docs any more... there's no reason to call it setup_function here.

Was it helpful?

Solution

You just implement the body of setup_function(), that function is called for each function whose name starts with test_ and the function is handed in as a parameter:

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

def test_test():
    assert False

This will give as output, when run with 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 ===========================

The line before the last one shows the output from the actual call to setup_function()

A slightly more useful example, actually doing something that influences the test 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

This was taken from py.test's own tests, always a good (and hopefully complete) set of examples of all the features of py.test.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top