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 #
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?