73 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
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
 |