How to use xunit-style setup_function
pytest, python
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`.
Problem
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.