test_ok2/doc/en/example/special.rst

85 lines
2.0 KiB
ReStructuredText
Raw Normal View History

2013-12-20 21:01:17 +08:00
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:
2019-08-07 04:25:54 +08:00
.. code-block:: python
# content of conftest.py
import pytest
2019-08-07 04:34:58 +08:00
@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")
2019-08-07 04:33:21 +08:00
seen = {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"):
2019-08-07 04:34:58 +08:00
cls.obj.callme()
2012-12-20 22:57:07 +08:00
seen.add(cls)
test classes may now define a ``callme`` method which
will be called ahead of running any tests:
2019-08-07 04:25:54 +08:00
.. code-block:: python
# content of test_module.py
2019-08-07 04:34:58 +08:00
2019-08-07 04:33:21 +08:00
class TestHello:
2012-12-20 22:57:07 +08:00
@classmethod
def callme(cls):
2018-11-22 16:15:14 +08:00
print("callme called!")
def test_method1(self):
2018-11-22 16:15:14 +08:00
print("test_method1 called")
def test_method2(self):
2018-11-22 16:15:14 +08:00
print("test_method1 called")
2019-08-07 04:34:58 +08:00
2019-08-07 04:33:21 +08:00
class TestOther:
2012-12-20 22:57:07 +08:00
@classmethod
def callme(cls):
2018-11-22 16:15:14 +08:00
print("callme other called")
2019-08-07 04:34:58 +08:00
def test_other(self):
2018-11-22 16:15:14 +08:00
print("test other")
2019-08-07 04:34:58 +08:00
2012-12-20 22:57:07 +08:00
# works with unittest as well ...
import unittest
2019-08-07 04:34:58 +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
$ pytest -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
2018-01-31 03:47:56 +08:00
.
2019-09-18 21:11:59 +08:00
4 passed in 0.12s