| A session-fixture which can look at all collected tests |
| ---------------------------------------------------------------- |
| |
| A session-scoped fixture effectively has access to all |
| collected test items. Here is an example of a fixture |
| function which walks all collected tests and looks |
| if their test class defines a ``callme`` method and |
| calls it:: |
| |
| # content of conftest.py |
| |
| import pytest |
| |
| @pytest.fixture(scope="session", autouse=True) |
| def callattr_ahead_of_alltests(request): |
| print ("callattr_ahead_of_alltests called") |
| seen = set([None]) |
| session = request.node |
| for item in session.items: |
| cls = item.getparent(pytest.Class) |
| if cls not in seen: |
| if hasattr(cls.obj, "callme"): |
| cls.obj.callme() |
| seen.add(cls) |
| |
| test classes may now define a ``callme`` method which |
| will be called ahead of running any tests:: |
| |
| # content of test_module.py |
| |
| class TestHello: |
| @classmethod |
| def callme(cls): |
| print ("callme called!") |
| |
| def test_method1(self): |
| print ("test_method1 called") |
| |
| def test_method2(self): |
| print ("test_method1 called") |
| |
| class TestOther: |
| @classmethod |
| def callme(cls): |
| print ("callme other called") |
| def test_other(self): |
| print ("test other") |
| |
| # works with unittest as well ... |
| import unittest |
| |
| class SomeTest(unittest.TestCase): |
| @classmethod |
| def callme(self): |
| print ("SomeTest callme called") |
| |
| def test_unit1(self): |
| print ("test_unit1 method called") |
| |
| If you run this without output capturing:: |
| |
| $ py.test -q -s test_module.py |
| callattr_ahead_of_alltests called |
| callme called! |
| callme other called |
| SomeTest callme called |
| test_method1 called |
| .test_method1 called |
| .test other |
| .test_unit1 method called |
| . |
| 4 passed in 0.12 seconds |