Baseline¶
pytest 8.0.0 - 8.0.2 - A plain test suite with no conftest and no plugins.
These 3 releases produced an identical flow, so they share one page. Identical as far as this scenario can measure - a scenario exercising more hooks may tell them apart.
The reference shape of a pytest run: parametrised tests, a yield fixture, a finalizer fixture, a skip, and one intentional failure. Every other scenario should be read as a diff against this one.
How this was produced¶
- Source:
scenarios/baseline/- the project this diagram was traced from - Invocation:
pytest . -q - Traced against: pytest 8.0.2, pluggy 1.6.0, Python 3.12.3
- Covers: 3 releases - pytest 8.0.0 - 8.0.2, which produced an identical flow
- Observed: 287 hook calls, 39 distinct hooks
The project is test_dummy.py. Browse it in the repository rather than inline here - scenarios grow directory trees, and GitHub renders them better than a collapsed block can.
The whole run¶
Phases left to right, steps top to bottom. Colour says which phase a hook belongs to; how dark a step is says how often it was called. Click a column heading to jump to that phase in full detail, or any hook to open its pytest documentation. Why it looks like this
Startup and configuration¶
Everything before collection begins: initial conftests are loaded, plugins register, and the session is configured.
Collection¶
Finding tests. Note that pytest_make_collect_report recurses - directories contain directories contain files.
The run-test protocol¶
pytest_runtestloop runs this once per collected test. Note the rhythm: setup, call and teardown are each followed by their own makereport and logreport pair - three reports per test, not one.
The path 5 of 8 took.
The others differed:
- 1 test also called
pytest_exception_interact - 1 test skipped
pytest_fixture_post_finalizer,pytest_fixture_setup,pytest_pyfunc_call,pytest_runtest_call - 1 test also called
pytest_warning_recordedand skippedpytest_fixture_post_finalizer,pytest_fixture_setup
Session finish¶
Summary reporting and teardown of the session.
Every hook observed¶
| Hook | Calls | Semantics | Implemented by, in call order |
|---|---|---|---|
pytest_cmdline_main |
1 | firstresult | _pytest.setupplan [tryfirst]_pytest.setuponly [tryfirst]_pytest.mark [tryfirst]_pytest.python_pytest.helpconfig_pytest.main |
pytest_cmdline_preparse |
1 | - | |
pytest_collect_directory |
1 | firstresult | _pytest.python_pytest.main |
pytest_collect_file |
3 | _pytest.doctest_pytest.python |
|
pytest_collection |
1 | firstresult | _pytest.logging.LoggingPlugin (logging-plugin) [wrapper, tryfirst]_pytest.warnings [wrapper, tryfirst]_pytest.config.Config (pytestconfig) [wrapper]_pytest.terminal.TerminalReporter_pytest.assertion_pytest.main |
pytest_collection_finish |
1 | _pytest.terminal.TerminalReporter |
|
pytest_collection_modifyitems |
1 | _pytest.fixtures.FixtureManager (funcmanage)_pytest.main_pytest.mark |
|
pytest_collectreport |
3 | _pytest.main.Session.pytest_runtest_logreport (session) [tryfirst]_pytest.terminal.TerminalReporter |
|
pytest_collectstart |
3 | _pytest.main.Session [tryfirst] |
|
pytest_configure |
1 | historic | _pytest.faulthandler_pytest.warnings_pytest.junitxml_pytest.tmpdir_pytest.legacypath_pytest.skipping_pytest.debugging_pytest.terminal_pytest.python_pytest.mark_pytest.config.PytestPluginManager (<anonymous>)_pytest.pastebin [trylast]_pytest.logging [trylast] |
pytest_exception_interact |
1 | _pytest.faulthandler [tryfirst] |
|
pytest_fixture_post_finalizer |
11 | _pytest.setuponly |
|
pytest_fixture_setup |
11 | firstresult | _pytest.setuponly [wrapper]_pytest.setupplan [tryfirst]_pytest.fixtures |
pytest_generate_tests |
4 | _pytest.fixtures.FixtureManager (funcmanage)_pytest.python |
|
pytest_ignore_collect |
3 | firstresult | _pytest.main |
pytest_itemcollected |
8 | - | |
pytest_load_initial_conftests |
1 | _pytest.warnings [wrapper]_pytest.capture [wrapper]_pytest.python_path [tryfirst]_pytest.legacypath [tryfirst]_pytest.config.Config (pytestconfig) [trylast] |
|
pytest_make_collect_report |
3 | firstresult | _pytest.capture.CaptureManager [wrapper]_pytest.runner |
pytest_make_parametrize_id |
5 | firstresult | - |
pytest_plugin_registered |
81 | historic | _pytest.legacypath_pytest.terminal.TerminalReporter_pytest.fixtures.FixtureManager (funcmanage) |
pytest_pycollect_makeitem |
10 | firstresult | _pytest.unittest_pytest.python [trylast] |
pytest_pycollect_makemodule |
1 | firstresult | _pytest.python |
pytest_pyfunc_call |
7 | firstresult | _pytest.python [trylast] |
pytest_report_collectionfinish |
1 | - | |
pytest_report_teststatus |
24 | firstresult | _pytest.skipping_pytest.runner_pytest.terminal [trylast] |
pytest_runtest_call |
7 | _pytest.threadexception [wrapper, tryfirst]_pytest.unraisableexception [wrapper, tryfirst]_pytest.logging.LoggingPlugin (logging-plugin) [wrapper]_pytest.capture.CaptureManager [wrapper]_pytest.skipping [wrapper]_pytest.runner |
|
pytest_runtest_logfinish |
8 | _pytest.logging.LoggingPlugin (logging-plugin)_pytest.terminal.TerminalReporter |
|
pytest_runtest_logreport |
23 | _pytest.main.Session [tryfirst]_pytest.logging.LoggingPlugin (logging-plugin)_pytest.terminal.TerminalReporter |
|
pytest_runtest_logstart |
8 | _pytest.logging.LoggingPlugin (logging-plugin)_pytest.terminal.TerminalReporter |
|
pytest_runtest_makereport |
23 | firstresult | _pytest.tmpdir [wrapper, tryfirst]_pytest.skipping [wrapper]_pytest.unittest [tryfirst]_pytest.runner |
pytest_runtest_protocol |
8 | firstresult | _pytest.warnings [wrapper, tryfirst]_pytest.assertion [wrapper, tryfirst]_pytest.unittest [wrapper]_pytest.faulthandler [wrapper, trylast]_pytest.runner |
pytest_runtest_setup |
8 | _pytest.unraisableexception [wrapper, tryfirst]_pytest.logging.LoggingPlugin (logging-plugin) [wrapper]_pytest.capture.CaptureManager [wrapper]_pytest.threadexception [wrapper, trylast]_pytest.skipping [tryfirst]_pytest.runner_pytest.nose [trylast] |
|
pytest_runtest_teardown |
8 | _pytest.threadexception [wrapper, tryfirst]_pytest.unraisableexception [wrapper, tryfirst]_pytest.logging.LoggingPlugin (logging-plugin) [wrapper]_pytest.capture.CaptureManager [wrapper]_pytest.runner |
|
pytest_runtestloop |
1 | firstresult | _pytest.logging.LoggingPlugin (logging-plugin) [wrapper]_pytest.main |
pytest_sessionfinish |
1 | _pytest.logging.LoggingPlugin (logging-plugin) [wrapper, tryfirst]_pytest.terminal.TerminalReporter [wrapper]_pytest.warnings [wrapper]_pytest.assertion_pytest.tmpdir_pytest.runner |
|
pytest_sessionstart |
1 | _pytest.logging.LoggingPlugin (logging-plugin) [wrapper, tryfirst]_pytest.fixtures_pytest.runner_pytest.terminal.TerminalReporter [trylast] |
|
pytest_terminal_summary |
1 | _pytest.terminal.TerminalReporter [wrapper]_pytest.warnings [wrapper]_pytest.pastebin_pytest.runner |
|
pytest_unconfigure |
1 | _pytest.logging.LoggingPlugin (logging-plugin)_pytest.terminal.TerminalReporter_pytest.faulthandler_pytest.doctest_pytest.junitxml_pytest.pastebin_pytest.mark_pytest.python_path [trylast] |
|
pytest_warning_recorded |
2 | historic | _pytest.terminal.TerminalReporter |