hookspec: improve collection phase documentation a bit

Make it a bit more accurate and use the same format that
pytest_runtest_protocol uses.
This commit is contained in:
Ran Benita 2020-08-20 22:59:15 +03:00
parent d69abff2c7
commit 172b6e15c5
2 changed files with 39 additions and 10 deletions

View File

@ -205,20 +205,32 @@ def pytest_load_initial_conftests(
@hookspec(firstresult=True) @hookspec(firstresult=True)
def pytest_collection(session: "Session") -> Optional[object]: def pytest_collection(session: "Session") -> Optional[object]:
"""Perform the collection protocol for the given session. """Perform the collection phase for the given session.
Stops at first non-None result, see :ref:`firstresult`. Stops at first non-None result, see :ref:`firstresult`.
The return value is not used, but only stops further processing. The return value is not used, but only stops further processing.
The hook is meant to set `session.items` to a sequence of items at least, The default collection phase is this (see individual hooks for full details):
but normally should follow this procedure:
1. Call the pytest_collectstart hook. 1. Starting from ``session`` as the initial collector:
2. Call the pytest_collectreport hook.
3. Call the pytest_collection_modifyitems hook. 1. ``pytest_collectstart(collector)``
4. Call the pytest_collection_finish hook. 2. ``report = pytest_make_collect_report(collector)``
5. Set session.testscollected to the amount of collect items. 3. ``pytest_exception_interact(collector, call, report)`` if an interactive exception occurred
6. Set `session.items` to a list of items. 4. For each collected node:
1. If an item, ``pytest_itemcollected(item)``
2. If a collector, recurse into it.
5. ``pytest_collectreport(report)``
2. ``pytest_collection_modifyitems(session, config, items)``
1. ``pytest_deselected(items)`` for any deselected items (may be called multiple times)
3. ``pytest_collection_finish(session)``
4. Set ``session.items`` to the list of collected items
5. Set ``session.testscollected`` to the number of collected items
You can implement this hook to only perform some action before collection, You can implement this hook to only perform some action before collection,
for example the terminal plugin uses it to start displaying the collection for example the terminal plugin uses it to start displaying the collection
@ -286,7 +298,10 @@ def pytest_collectreport(report: "CollectReport") -> None:
def pytest_deselected(items: Sequence["Item"]) -> None: def pytest_deselected(items: Sequence["Item"]) -> None:
"""Called for deselected test items, e.g. by keyword.""" """Called for deselected test items, e.g. by keyword.
May be called multiple times.
"""
@hookspec(firstresult=True) @hookspec(firstresult=True)

View File

@ -538,6 +538,20 @@ class Session(nodes.FSCollector):
def perform_collect( # noqa: F811 def perform_collect( # noqa: F811
self, args: Optional[Sequence[str]] = None, genitems: bool = True self, args: Optional[Sequence[str]] = None, genitems: bool = True
) -> Sequence[Union[nodes.Item, nodes.Collector]]: ) -> Sequence[Union[nodes.Item, nodes.Collector]]:
"""Perform the collection phase for this session.
This is called by the default
:func:`pytest_collection <_pytest.hookspec.pytest_collection>` hook
implementation; see the documentation of this hook for more details.
For testing purposes, it may also be called directly on a fresh
``Session``.
This function normally recursively expands any collectors collected
from the session to their items, and only items are returned. For
testing purposes, this may be suppressed by passing ``genitems=False``,
in which case the return value contains these collectors unexpanded,
and ``session.items`` is empty.
"""
hook = self.config.hook hook = self.config.hook
try: try:
items = self._perform_collect(args, genitems) items = self._perform_collect(args, genitems)