2013-12-20 21:01:17 +08:00
|
|
|
A session-fixture which can look at all collected tests
|
2012-12-16 18:28:17 +08:00
|
|
|
----------------------------------------------------------------
|
|
|
|
|
2014-09-15 21:04:09 +08:00
|
|
|
A session-scoped fixture effectively has access to all
|
2012-12-16 18:28:17 +08:00
|
|
|
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):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("callattr_ahead_of_alltests called")
|
2012-12-16 18:28:17 +08:00
|
|
|
seen = set([None])
|
|
|
|
session = request.node
|
|
|
|
for item in session.items:
|
2012-12-20 22:57:07 +08:00
|
|
|
cls = item.getparent(pytest.Class)
|
|
|
|
if cls not in seen:
|
|
|
|
if hasattr(cls.obj, "callme"):
|
|
|
|
cls.obj.callme()
|
|
|
|
seen.add(cls)
|
2012-12-16 18:28:17 +08:00
|
|
|
|
|
|
|
test classes may now define a ``callme`` method which
|
|
|
|
will be called ahead of running any tests::
|
|
|
|
|
|
|
|
# content of test_module.py
|
|
|
|
|
2017-02-17 02:41:51 +08:00
|
|
|
class TestHello(object):
|
2012-12-20 22:57:07 +08:00
|
|
|
@classmethod
|
|
|
|
def callme(cls):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("callme called!")
|
2012-12-16 18:28:17 +08:00
|
|
|
|
|
|
|
def test_method1(self):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("test_method1 called")
|
2014-09-15 21:04:09 +08:00
|
|
|
|
2012-12-16 18:28:17 +08:00
|
|
|
def test_method2(self):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("test_method1 called")
|
2012-12-16 18:28:17 +08:00
|
|
|
|
2017-02-17 02:41:51 +08:00
|
|
|
class TestOther(object):
|
2012-12-20 22:57:07 +08:00
|
|
|
@classmethod
|
|
|
|
def callme(cls):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("callme other called")
|
2012-12-16 18:28:17 +08:00
|
|
|
def test_other(self):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("test other")
|
2012-12-16 18:28:17 +08:00
|
|
|
|
2012-12-20 22:57:07 +08:00
|
|
|
# works with unittest as well ...
|
|
|
|
import unittest
|
2014-09-15 21:04:09 +08:00
|
|
|
|
2012-12-20 22:57:07 +08:00
|
|
|
class SomeTest(unittest.TestCase):
|
|
|
|
@classmethod
|
|
|
|
def callme(self):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("SomeTest callme called")
|
2012-12-20 22:57:07 +08:00
|
|
|
|
|
|
|
def test_unit1(self):
|
2018-11-22 16:15:14 +08:00
|
|
|
print("test_unit1 method called")
|
2012-12-20 22:57:07 +08:00
|
|
|
|
2018-11-24 13:41:22 +08:00
|
|
|
If you run this without output capturing:
|
|
|
|
|
|
|
|
.. code-block:: pytest
|
2012-12-16 18:28:17 +08:00
|
|
|
|
2016-06-21 22:16:57 +08:00
|
|
|
$ pytest -q -s test_module.py
|
2014-09-15 21:04:09 +08:00
|
|
|
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
|
2018-01-31 03:47:56 +08:00
|
|
|
.
|
2015-06-07 05:30:49 +08:00
|
|
|
4 passed in 0.12 seconds
|