The pytest
unit-testing framework for Python comes with some powerful debugging abilities via the interactive Python debugger (“Debug Mode”), which utilizes the following two libraries: the included pdb
library, and the improved (but optional) ipdb
library. This interactive Python debugger lets you take control of scripts in realtime for easy debugging.
Debug Mode in pytest
can be triggered in a few different ways:
- Your test raises an exception after passing the
"--pdb"
option to"pytest"
. - The moment your test begins after passing the
"--trace"
option to"pytest"
. - Calling
"pdb.set_trace()"
or"ipdb.set_trace()"
from your test after importing"pdb"
or"ipdb"
respectively. (Python versions 3.7+ and newer can also use the"breakpoint()"
method to enter Debug Mode.)
When Debug Mode is activated, the browser window will remain open (when used in combination with browser automation), and you can see how variables look from the command-line.
(Note that you may need to add "-s"
to your "pytest"
run command to allow breakpoints, unless you already have a "pytest.ini"
file present with "addops = --capture=no"
in it.)
Once you’re in Debug Mode, there are several commands that you can use in order to control and debug tests:
n (next)
: Execute the next line of the current method block.s (step)
: Step through and execute the next line of the current method block (but if the current method calls another method, go down the stack).c (continue)
: Leave Debug Mode and continue the test where the current method left off.r (return)
: Continue running the test until the current method returns.j (jump)
: Jump to the line number of the current method block.w (where)
: Show where you are within the current stack trace.u (up)
: Move up the stack.d (down)
: Move down the stack.ll (longlist)
: See the code for the current method block.dir()
: List namespace objects.h (help)
: List all available commands.
Additionally, you can execute any Python code that you want from within Debug Mode.
Not all Debug Modes are the same. If you enter Debug Mode after a test raises an exception, you are in the special “Post Mortem Debug Mode”, which lets you explore the stack of the current stack trace, but you can no longer advance to the next line of the method that you were in because that would end the test immediately.
The ipdb
add-on improves the experience of the pdb
debugger:
ipdb
Debug Mode adds color-coded syntax highlighting, tab-completion, and an expanded view of the code with line numbers. ipdb
must be installed separately from pytest
before use:
pip install ipdb
In order to use the ipdb
library by default in “Post Mortem Debug Mode”, you need to call your pytest
run command with this set of args:
--pdb --pdbcls=IPython.terminal.debugger:TerminalPdb
You can make that effect more permanent by using a pytest.ini
file that includes a line with:
addopts = --pdbcls=IPython.terminal.debugger:TerminalPdb
At that point, all you need to add is the --pdb
option when you want tests to enter ipdb Debug Mode on failures.
Once you familiarize yourself with the controls of Debug Mode, debugging tests will become much easier, and you’ll save a lot of time with test creation and maintenance!