pdb: handle capturing with fixtures only
This commit is contained in:
		
							parent
							
								
									c92021fc4f
								
							
						
					
					
						commit
						d406786a8d
					
				|  | @ -107,6 +107,16 @@ class CaptureManager(object): | ||||||
|             return MultiCapture(out=False, err=False, in_=False) |             return MultiCapture(out=False, err=False, in_=False) | ||||||
|         raise ValueError("unknown capturing method: %r" % method)  # pragma: no cover |         raise ValueError("unknown capturing method: %r" % method)  # pragma: no cover | ||||||
| 
 | 
 | ||||||
|  |     def is_capturing(self): | ||||||
|  |         if self.is_globally_capturing(): | ||||||
|  |             return "global" | ||||||
|  |         capture_fixture = getattr(self._current_item, "_capture_fixture", None) | ||||||
|  |         if capture_fixture is not None: | ||||||
|  |             return ( | ||||||
|  |                 "fixture %s" % self._current_item._capture_fixture.request.fixturename | ||||||
|  |             ) | ||||||
|  |         return False | ||||||
|  | 
 | ||||||
|     # Global capturing control |     # Global capturing control | ||||||
| 
 | 
 | ||||||
|     def is_globally_capturing(self): |     def is_globally_capturing(self): | ||||||
|  | @ -134,6 +144,14 @@ class CaptureManager(object): | ||||||
|         if cap is not None: |         if cap is not None: | ||||||
|             cap.suspend_capturing(in_=in_) |             cap.suspend_capturing(in_=in_) | ||||||
| 
 | 
 | ||||||
|  |     def suspend(self, in_=False): | ||||||
|  |         self.suspend_fixture(self._current_item) | ||||||
|  |         self.suspend_global_capture(in_) | ||||||
|  | 
 | ||||||
|  |     def resume(self): | ||||||
|  |         self.resume_global_capture() | ||||||
|  |         self.resume_fixture(self._current_item) | ||||||
|  | 
 | ||||||
|     def read_global_capture(self): |     def read_global_capture(self): | ||||||
|         return self._global_capturing.readouterr() |         return self._global_capturing.readouterr() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -109,7 +109,7 @@ class pytestPDB(object): | ||||||
|         if cls._pluginmanager is not None: |         if cls._pluginmanager is not None: | ||||||
|             capman = cls._pluginmanager.getplugin("capturemanager") |             capman = cls._pluginmanager.getplugin("capturemanager") | ||||||
|             if capman: |             if capman: | ||||||
|                 capman.suspend_global_capture(in_=True) |                 capman.suspend(in_=True) | ||||||
|             tw = _pytest.config.create_terminal_writer(cls._config) |             tw = _pytest.config.create_terminal_writer(cls._config) | ||||||
|             tw.line() |             tw.line() | ||||||
|             if cls._recursive_debug == 0: |             if cls._recursive_debug == 0: | ||||||
|  | @ -117,10 +117,22 @@ class pytestPDB(object): | ||||||
|                 header = kwargs.pop("header", None) |                 header = kwargs.pop("header", None) | ||||||
|                 if header is not None: |                 if header is not None: | ||||||
|                     tw.sep(">", header) |                     tw.sep(">", header) | ||||||
|                 elif capman and capman.is_globally_capturing(): |  | ||||||
|                     tw.sep(">", "PDB set_trace (IO-capturing turned off)") |  | ||||||
|                 else: |                 else: | ||||||
|                     tw.sep(">", "PDB set_trace") |                     if capman: | ||||||
|  |                         capturing = capman.is_capturing() | ||||||
|  |                     else: | ||||||
|  |                         capturing = False | ||||||
|  |                     if capturing: | ||||||
|  |                         if capturing == "global": | ||||||
|  |                             tw.sep(">", "PDB set_trace (IO-capturing turned off)") | ||||||
|  |                         else: | ||||||
|  |                             tw.sep( | ||||||
|  |                                 ">", | ||||||
|  |                                 "PDB set_trace (IO-capturing turned off for %s)" | ||||||
|  |                                 % capturing, | ||||||
|  |                             ) | ||||||
|  |                     else: | ||||||
|  |                         tw.sep(">", "PDB set_trace") | ||||||
| 
 | 
 | ||||||
|             class _PdbWrapper(cls._pdb_cls, object): |             class _PdbWrapper(cls._pdb_cls, object): | ||||||
|                 _pytest_capman = capman |                 _pytest_capman = capman | ||||||
|  | @ -138,11 +150,18 @@ class pytestPDB(object): | ||||||
|                         tw = _pytest.config.create_terminal_writer(cls._config) |                         tw = _pytest.config.create_terminal_writer(cls._config) | ||||||
|                         tw.line() |                         tw.line() | ||||||
|                         if cls._recursive_debug == 0: |                         if cls._recursive_debug == 0: | ||||||
|                             if self._pytest_capman.is_globally_capturing(): |                             capturing = self._pytest_capman.is_capturing() | ||||||
|  |                             if capturing == "global": | ||||||
|                                 tw.sep(">", "PDB continue (IO-capturing resumed)") |                                 tw.sep(">", "PDB continue (IO-capturing resumed)") | ||||||
|  |                             elif capturing: | ||||||
|  |                                 tw.sep( | ||||||
|  |                                     ">", | ||||||
|  |                                     "PDB continue (IO-capturing resumed for %s)" | ||||||
|  |                                     % capturing, | ||||||
|  |                                 ) | ||||||
|                             else: |                             else: | ||||||
|                                 tw.sep(">", "PDB continue") |                                 tw.sep(">", "PDB continue") | ||||||
|                             self._pytest_capman.resume_global_capture() |                             self._pytest_capman.resume() | ||||||
|                     cls._pluginmanager.hook.pytest_leave_pdb( |                     cls._pluginmanager.hook.pytest_leave_pdb( | ||||||
|                         config=cls._config, pdb=self |                         config=cls._config, pdb=self | ||||||
|                     ) |                     ) | ||||||
|  |  | ||||||
|  | @ -970,3 +970,52 @@ def test_quit_with_swallowed_SystemExit(testdir): | ||||||
|     rest = child.read().decode("utf8") |     rest = child.read().decode("utf8") | ||||||
|     assert "no tests ran" in rest |     assert "no tests ran" in rest | ||||||
|     TestPDB.flush(child) |     TestPDB.flush(child) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @pytest.mark.parametrize("fixture", ("capfd", "capsys")) | ||||||
|  | def test_pdb_suspends_fixture_capturing(testdir, fixture): | ||||||
|  |     """Using "-s" with pytest should suspend/resume fixture capturing.""" | ||||||
|  |     p1 = testdir.makepyfile( | ||||||
|  |         """ | ||||||
|  |         def test_inner({fixture}): | ||||||
|  |             import sys | ||||||
|  | 
 | ||||||
|  |             print("out_inner_before") | ||||||
|  |             sys.stderr.write("err_inner_before\\n") | ||||||
|  | 
 | ||||||
|  |             __import__("pdb").set_trace() | ||||||
|  | 
 | ||||||
|  |             print("out_inner_after") | ||||||
|  |             sys.stderr.write("err_inner_after\\n") | ||||||
|  | 
 | ||||||
|  |             out, err = {fixture}.readouterr() | ||||||
|  |             assert out =="out_inner_before\\nout_inner_after\\n" | ||||||
|  |             assert err =="err_inner_before\\nerr_inner_after\\n" | ||||||
|  |         """.format( | ||||||
|  |             fixture=fixture | ||||||
|  |         ) | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     child = testdir.spawn_pytest(str(p1) + " -s") | ||||||
|  | 
 | ||||||
|  |     child.expect("Pdb") | ||||||
|  |     before = child.before.decode("utf8") | ||||||
|  |     assert ( | ||||||
|  |         "> PDB set_trace (IO-capturing turned off for fixture %s) >" % (fixture) | ||||||
|  |         in before | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     # Test that capturing is really suspended. | ||||||
|  |     child.sendline("p 40 + 2") | ||||||
|  |     child.expect("Pdb") | ||||||
|  |     assert "\r\n42\r\n" in child.before.decode("utf8") | ||||||
|  | 
 | ||||||
|  |     child.sendline("c") | ||||||
|  |     rest = child.read().decode("utf8") | ||||||
|  |     assert "out_inner" not in rest | ||||||
|  |     assert "err_inner" not in rest | ||||||
|  | 
 | ||||||
|  |     TestPDB.flush(child) | ||||||
|  |     assert child.exitstatus == 0 | ||||||
|  |     assert "= 1 passed in " in rest | ||||||
|  |     assert "> PDB continue (IO-capturing resumed for fixture %s) >" % (fixture) in rest | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue