Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1from typing import Generator 

2from typing import Optional 

3from typing import Union 

4 

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 

12 

13 

14def pytest_addoption(parser: Parser) -> None: 

15 group = parser.getgroup("debugconfig") 

16 group.addoption( 

17 "--setuponly", 

18 "--setup-only", 

19 action="store_true", 

20 help="only setup fixtures, do not execute tests.", 

21 ) 

22 group.addoption( 

23 "--setupshow", 

24 "--setup-show", 

25 action="store_true", 

26 help="show setup of fixtures while executing tests.", 

27 ) 

28 

29 

30@pytest.hookimpl(hookwrapper=True) 

31def pytest_fixture_setup( 

32 fixturedef: FixtureDef, request: SubRequest 

33) -> Generator[None, None, None]: 

34 yield 

35 if request.config.option.setupshow: 

36 if hasattr(request, "param"): 

37 # Save the fixture parameter so ._show_fixture_action() can 

38 # display it now and during the teardown (in .finish()). 

39 if fixturedef.ids: 

40 if callable(fixturedef.ids): 

41 param = fixturedef.ids(request.param) 

42 else: 

43 param = fixturedef.ids[request.param_index] 

44 else: 

45 param = request.param 

46 fixturedef.cached_param = param # type: ignore[attr-defined] 

47 _show_fixture_action(fixturedef, "SETUP") 

48 

49 

50def pytest_fixture_post_finalizer(fixturedef: FixtureDef) -> None: 

51 if fixturedef.cached_result is not None: 

52 config = fixturedef._fixturemanager.config 

53 if config.option.setupshow: 

54 _show_fixture_action(fixturedef, "TEARDOWN") 

55 if hasattr(fixturedef, "cached_param"): 

56 del fixturedef.cached_param # type: ignore[attr-defined] 

57 

58 

59def _show_fixture_action(fixturedef: FixtureDef, msg: str) -> None: 

60 config = fixturedef._fixturemanager.config 

61 capman = config.pluginmanager.getplugin("capturemanager") 

62 if capman: 

63 capman.suspend_global_capture() 

64 

65 tw = config.get_terminal_writer() 

66 tw.line() 

67 tw.write(" " * 2 * fixturedef.scopenum) 

68 tw.write( 

69 "{step} {scope} {fixture}".format( 

70 step=msg.ljust(8), # align the output to TEARDOWN 

71 scope=fixturedef.scope[0].upper(), 

72 fixture=fixturedef.argname, 

73 ) 

74 ) 

75 

76 if msg == "SETUP": 

77 deps = sorted(arg for arg in fixturedef.argnames if arg != "request") 

78 if deps: 

79 tw.write(" (fixtures used: {})".format(", ".join(deps))) 

80 

81 if hasattr(fixturedef, "cached_param"): 

82 tw.write("[{}]".format(saferepr(fixturedef.cached_param, maxsize=42))) # type: ignore[attr-defined] 

83 

84 tw.flush() 

85 

86 if capman: 

87 capman.resume_global_capture() 

88 

89 

90@pytest.hookimpl(tryfirst=True) 

91def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: 

92 if config.option.setuponly: 

93 config.option.setupshow = True 

94 return None