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
            #

.. _optparse: http://docs.python.org/library/optparse.html

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?
