pytest_pycharm.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. # -*- coding: utf-8 -*-
  2. import threading
  3. def pytest_exception_interact(node, call, report):
  4. """
  5. Drop into PyCharm debugger, if available, on uncaught exceptions.
  6. """
  7. try:
  8. import pydevd
  9. from pydevd import pydevd_tracing
  10. except ImportError:
  11. pass
  12. else:
  13. exctype, value, traceback = call.excinfo._excinfo
  14. frames = []
  15. while traceback:
  16. frames.append(traceback.tb_frame)
  17. traceback = traceback.tb_next
  18. thread = threading.current_thread()
  19. frames_by_id = dict([(id(frame), frame) for frame in frames])
  20. frame = frames[-1]
  21. exception = (exctype, value, traceback)
  22. if hasattr(thread, "additional_info"):
  23. thread.additional_info.pydev_message = "test fail"
  24. try:
  25. debugger = pydevd.debugger
  26. except AttributeError:
  27. debugger = pydevd.get_global_debugger()
  28. pydevd_tracing.SetTrace(None) # no tracing from here
  29. try:
  30. debugger.stop_on_unhandled_exception(thread, frame, frames_by_id, exception)
  31. except AttributeError:
  32. # fallback to pre PyCharm 2019.2 API
  33. debugger.handle_post_mortem_stop(thread, frame, frames_by_id, exception)
  34. return report