Learning by examples

adding custom options

py.test supports adding of standard optparse Options. A plugin may implement the addoption hook for registering custom options:

def pytest_addoption(parser):
    parser.addoption("-M", "--myopt", action="store",
        help="specify string to set myopt")

def pytest_configure(config):
    if config.option.myopt:
        # do action based on option value
        #

Working Examples

managing state at module, class and method level

Here is a working example for what goes on when you setup modules, classes and methods:

# [[from py/documentation/example/pytest/test_setup_flow_example.py]]

def setup_module(module):
    module.TestStateFullThing.classcount = 0

class TestStateFullThing:
    def setup_class(cls):
        cls.classcount += 1

    def teardown_class(cls):
        cls.classcount -= 1

    def setup_method(self, method):
        self.id = eval(method.func_name[5:])

    def test_42(self):
        assert self.classcount == 1
        assert self.id == 42

    def test_23(self):
        assert self.classcount == 1
        assert self.id == 23

def teardown_module(module):
    assert module.TestStateFullThing.classcount == 0

For this example the control flow happens as follows:

import test_setup_flow_example
setup_module(test_setup_flow_example)
   setup_class(TestStateFullThing)
       instance = TestStateFullThing()
       setup_method(instance, instance.test_42)
          instance.test_42()
       setup_method(instance, instance.test_23)
          instance.test_23()
   teardown_class(TestStateFullThing)
teardown_module(test_setup_flow_example)

Note that setup_class(TestStateFullThing) is called and not TestStateFullThing.setup_class() which would require you to insert setup_class = classmethod(setup_class) to make your setup function callable. Did we mention that lazyness is a virtue?