Baseline¶
pytest 7.0.0 - 7.0.1 - A plain test suite with no conftest and no plugins.
These 2 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 -p hook_atlas_pytest . -q - Traced against: pytest 7.0.1, pluggy 1.6.0, Python 3.9.25
- Covers: 2 releases - pytest 7.0.0 - 7.0.1, 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_captured,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_file |
4 | _pytest.doctest_pytest.python |
|
pytest_collection |
1 | firstresult | _pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper, tryfirst]_pytest.warnings [hookwrapper, tryfirst]_pytest.config.Config (pytestconfig) [hookwrapper]_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 |
2 | _pytest.main.Session.pytest_runtest_logreport (session) [tryfirst]_pytest.terminal.TerminalReporter |
|
pytest_collectstart |
2 | _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 [hookwrapper]_pytest.setupplan [tryfirst]_pytest.fixtures |
pytest_generate_tests |
4 | _pytest.fixtures.FixtureManager (funcmanage)_pytest.python |
|
pytest_ignore_collect |
4 | firstresult | _pytest.main |
pytest_itemcollected |
8 | - | |
pytest_load_initial_conftests |
1 | _pytest.warnings [hookwrapper]_pytest.capture [hookwrapper]_pytest.python_path [tryfirst]_pytest.legacypath [tryfirst]_pytest.config.Config (pytestconfig) [trylast]1 |
|
pytest_make_collect_report |
2 | firstresult | _pytest.capture.CaptureManager [hookwrapper]_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 [hookwrapper, tryfirst]_pytest.unraisableexception [hookwrapper, tryfirst]_pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper]_pytest.capture.CaptureManager [hookwrapper]_pytest.skipping [hookwrapper]_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.skipping [hookwrapper]_pytest.unittest [tryfirst]_pytest.runner |
pytest_runtest_protocol |
8 | firstresult | _pytest.warnings [hookwrapper, tryfirst]_pytest.assertion [hookwrapper, tryfirst]_pytest.unittest [hookwrapper]_pytest.faulthandler [hookwrapper, trylast]_pytest.runner |
pytest_runtest_setup |
8 | _pytest.unraisableexception [hookwrapper, tryfirst]_pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper]_pytest.capture.CaptureManager [hookwrapper]_pytest.threadexception [hookwrapper, trylast]_pytest.skipping [tryfirst]_pytest.runner_pytest.nose [trylast] |
|
pytest_runtest_teardown |
8 | _pytest.threadexception [hookwrapper, tryfirst]_pytest.unraisableexception [hookwrapper, tryfirst]_pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper]_pytest.capture.CaptureManager [hookwrapper]_pytest.runner |
|
pytest_runtestloop |
1 | firstresult | _pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper]_pytest.main |
pytest_sessionfinish |
1 | _pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper, tryfirst]_pytest.terminal.TerminalReporter [hookwrapper]_pytest.warnings [hookwrapper]_pytest.assertion_pytest.runner |
|
pytest_sessionstart |
1 | _pytest.logging.LoggingPlugin (logging-plugin) [hookwrapper, tryfirst]_pytest.fixtures_pytest.runner_pytest.terminal.TerminalReporter [trylast] |
|
pytest_terminal_summary |
1 | _pytest.terminal.TerminalReporter [hookwrapper]_pytest.warnings [hookwrapper]_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]2 |
|
pytest_warning_captured |
2 | historic | - |
pytest_warning_recorded |
2 | historic | _pytest.terminal.TerminalReporter |
2 of these changed implementer somewhere in pytest 7.0.0 - 7.0.1 without changing the flow - pytest moves implementations between its own plugins. The table shows the newest; what changed along the way is below.