from typing import Generator from typing import Optional from typing import Union import pytest from _pytest._io.saferepr import saferepr from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config.argparsing import Parser from _pytest.fixtures import FixtureDef from _pytest.fixtures import SubRequest from _pytest.scope import Scope def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("debugconfig") group.addoption( "--setuponly", "--setup-only", action="store_true", help="Only setup fixtures, do not execute tests", ) group.addoption( "--setupshow", "--setup-show", action="store_true", help="Show setup of fixtures while executing tests", ) @pytest.hookimpl(hookwrapper=True) def pytest_fixture_setup( fixturedef: FixtureDef[object], request: SubRequest ) -> Generator[None, None, None]: yield if request.config.option.setupshow: if hasattr(request, "param"): # Save the fixture parameter so ._show_fixture_action() can # display it now and during the teardown (in .finish()). if fixturedef.ids: if callable(fixturedef.ids): param = fixturedef.ids(request.param) else: param = fixturedef.ids[request.param_index] else: param = request.param fixturedef.cached_param = param # type: ignore[attr-defined] _show_fixture_action(fixturedef, "SETUP") def pytest_fixture_post_finalizer(fixturedef: FixtureDef[object]) -> None: if fixturedef.cached_result is not None: config = fixturedef._fixturemanager.config if config.option.setupshow: _show_fixture_action(fixturedef, "TEARDOWN") if hasattr(fixturedef, "cached_param"): del fixturedef.cached_param # type: ignore[attr-defined] def _show_fixture_action(fixturedef: FixtureDef[object], msg: str) -> None: config = fixturedef._fixturemanager.config capman = config.pluginmanager.getplugin("capturemanager") if capman: capman.suspend_global_capture() tw = config.get_terminal_writer() tw.line() # Use smaller indentation the higher the scope: Session = 0, Package = 1, etc. scope_indent = list(reversed(Scope)).index(fixturedef._scope) tw.write(" " * 2 * scope_indent) tw.write( "{step} {scope} {fixture}".format( step=msg.ljust(8), # align the output to TEARDOWN scope=fixturedef.scope[0].upper(), fixture=fixturedef.argname, ) ) if msg == "SETUP": deps = sorted(arg for arg in fixturedef.argnames if arg != "request") if deps: tw.write(" (fixtures used: {})".format(", ".join(deps))) if hasattr(fixturedef, "cached_param"): tw.write(f"[{saferepr(fixturedef.cached_param, maxsize=42)}]") # type: ignore[attr-defined] tw.flush() if capman: capman.resume_global_capture() @pytest.hookimpl(tryfirst=True) def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: if config.option.setuponly: config.option.setupshow = True return None
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
_code | Folder | 0755 |
|
|
_io | Folder | 0755 |
|
|
_py | Folder | 0755 |
|
|
assertion | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
mark | Folder | 0755 |
|
|
__init__.py | File | 356 B | 0644 |
|
_argcomplete.py | File | 3.71 KB | 0644 |
|
_version.py | File | 160 B | 0644 |
|
cacheprovider.py | File | 20.89 KB | 0644 |
|
capture.py | File | 33.92 KB | 0644 |
|
compat.py | File | 12.89 KB | 0644 |
|
debugging.py | File | 13.18 KB | 0644 |
|
deprecated.py | File | 5.36 KB | 0644 |
|
doctest.py | File | 25.35 KB | 0644 |
|
faulthandler.py | File | 3.04 KB | 0644 |
|
fixtures.py | File | 65.51 KB | 0644 |
|
freeze_support.py | File | 1.31 KB | 0644 |
|
helpconfig.py | File | 8.34 KB | 0644 |
|
hookspec.py | File | 31.79 KB | 0644 |
|
junitxml.py | File | 25.11 KB | 0644 |
|
legacypath.py | File | 16.53 KB | 0644 |
|
logging.py | File | 33.23 KB | 0644 |
|
main.py | File | 31.73 KB | 0644 |
|
monkeypatch.py | File | 14.51 KB | 0644 |
|
nodes.py | File | 25.94 KB | 0644 |
|
nose.py | File | 1.65 KB | 0644 |
|
outcomes.py | File | 10.02 KB | 0644 |
|
pastebin.py | File | 3.86 KB | 0644 |
|
pathlib.py | File | 25.22 KB | 0644 |
|
py.typed | File | 0 B | 0644 |
|
pytester.py | File | 60.52 KB | 0644 |
|
pytester_assertions.py | File | 2.27 KB | 0644 |
|
python.py | File | 69.49 KB | 0644 |
|
python_api.py | File | 37.5 KB | 0644 |
|
python_path.py | File | 709 B | 0644 |
|
recwarn.py | File | 10.67 KB | 0644 |
|
reports.py | File | 20.35 KB | 0644 |
|
runner.py | File | 18.01 KB | 0644 |
|
scope.py | File | 2.81 KB | 0644 |
|
setuponly.py | File | 3.18 KB | 0644 |
|
setupplan.py | File | 1.19 KB | 0644 |
|
skipping.py | File | 9.96 KB | 0644 |
|
stash.py | File | 2.98 KB | 0644 |
|
stepwise.py | File | 4.6 KB | 0644 |
|
terminal.py | File | 52.25 KB | 0644 |
|
threadexception.py | File | 2.85 KB | 0644 |
|
timing.py | File | 375 B | 0644 |
|
tmpdir.py | File | 11.43 KB | 0644 |
|
unittest.py | File | 14.46 KB | 0644 |
|
unraisableexception.py | File | 3.12 KB | 0644 |
|
warning_types.py | File | 4.37 KB | 0644 |
|
warnings.py | File | 4.95 KB | 0644 |
|