Coverage for /opt/homebrew/lib/python3.11/site-packages/_pytest/setuponly.py: 48%
58 statements
« prev ^ index » next coverage.py v7.2.3, created at 2023-05-04 13:14 +0700
« prev ^ index » next coverage.py v7.2.3, created at 2023-05-04 13:14 +0700
1from typing import Generator
2from typing import Optional
3from typing import Union
5import pytest
6from _pytest._io.saferepr import saferepr
7from _pytest.config import Config
8from _pytest.config import ExitCode
9from _pytest.config.argparsing import Parser
10from _pytest.fixtures import FixtureDef
11from _pytest.fixtures import SubRequest
12from _pytest.scope import Scope
15def pytest_addoption(parser: Parser) -> None:
16 group = parser.getgroup("debugconfig")
17 group.addoption(
18 "--setuponly",
19 "--setup-only",
20 action="store_true",
21 help="Only setup fixtures, do not execute tests",
22 )
23 group.addoption(
24 "--setupshow",
25 "--setup-show",
26 action="store_true",
27 help="Show setup of fixtures while executing tests",
28 )
31@pytest.hookimpl(hookwrapper=True)
32def pytest_fixture_setup(
33 fixturedef: FixtureDef[object], request: SubRequest
34) -> Generator[None, None, None]:
35 yield
36 if request.config.option.setupshow:
37 if hasattr(request, "param"):
38 # Save the fixture parameter so ._show_fixture_action() can
39 # display it now and during the teardown (in .finish()).
40 if fixturedef.ids:
41 if callable(fixturedef.ids):
42 param = fixturedef.ids(request.param)
43 else:
44 param = fixturedef.ids[request.param_index]
45 else:
46 param = request.param
47 fixturedef.cached_param = param # type: ignore[attr-defined]
48 _show_fixture_action(fixturedef, "SETUP")
51def pytest_fixture_post_finalizer(fixturedef: FixtureDef[object]) -> None:
52 if fixturedef.cached_result is not None:
53 config = fixturedef._fixturemanager.config
54 if config.option.setupshow:
55 _show_fixture_action(fixturedef, "TEARDOWN")
56 if hasattr(fixturedef, "cached_param"):
57 del fixturedef.cached_param # type: ignore[attr-defined]
60def _show_fixture_action(fixturedef: FixtureDef[object], msg: str) -> None:
61 config = fixturedef._fixturemanager.config
62 capman = config.pluginmanager.getplugin("capturemanager")
63 if capman:
64 capman.suspend_global_capture()
66 tw = config.get_terminal_writer()
67 tw.line()
68 # Use smaller indentation the higher the scope: Session = 0, Package = 1, etc.
69 scope_indent = list(reversed(Scope)).index(fixturedef._scope)
70 tw.write(" " * 2 * scope_indent)
71 tw.write(
72 "{step} {scope} {fixture}".format(
73 step=msg.ljust(8), # align the output to TEARDOWN
74 scope=fixturedef.scope[0].upper(),
75 fixture=fixturedef.argname,
76 )
77 )
79 if msg == "SETUP":
80 deps = sorted(arg for arg in fixturedef.argnames if arg != "request")
81 if deps:
82 tw.write(" (fixtures used: {})".format(", ".join(deps)))
84 if hasattr(fixturedef, "cached_param"):
85 tw.write(f"[{saferepr(fixturedef.cached_param, maxsize=42)}]") # type: ignore[attr-defined]
87 tw.flush()
89 if capman:
90 capman.resume_global_capture()
93@pytest.hookimpl(tryfirst=True)
94def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]:
95 if config.option.setuponly:
96 config.option.setupshow = True
97 return None