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
Traceback (most recent call last):
  File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/config.py", line 513, in getconftestmodules
    return self._path2confmods[path]
KeyError: local('/tmp/doc-exec-244/test_module.py')

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/config.py", line 537, in importconftest
    return self._conftestpath2mod[conftestpath]
KeyError: local('/tmp/doc-exec-244/conftest.py')

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/_pytest/config.py", line 543, in importconftest
    mod = conftestpath.pyimport()
  File "/home/hpk/p/pytest/.tox/regen/lib/python3.4/site-packages/py/_path/local.py", line 620, in pyimport
    __import__(modname)
  File "/tmp/doc-exec-244/conftest.py", line 6
    print "callattr_ahead_of_alltests called"
                                            ^
SyntaxError: invalid syntax
ERROR: could not load /tmp/doc-exec-244/conftest.py