Python Testing and Debugging
Today, I want to share some thoughts on errors and debugging that we encounter all the time when writing programs, plus some strategies to prevent them.
Specifications, Testing, and Debugging
First, let's clarify some terms.
Specification
A specification is what you want to achieve by writing your program.
Testing
Testing means actually running your program to see if it meets the specification. The input and expected output pairs you use for testing are called test cases.
Debugging
Sometimes when you test your program, it doesn't work as specified. We call these issues bugs, and the process of fixing them is called debugging.
Development Flow
- Analyze the specification
- Write the program
- Test it
- Debug it
- Test again...
You keep repeating steps 1-4 in a loop.
Useful Statements for Debugging
assert
Statement
The assert
statement is super useful for testing and debugging.
It declares that the condition following assert
should be True
. If it's false, you get an AssertionError
.
Here's what happened when I triggered an AssertionError in my terminal:
The assert
statement stays quiet when conditions are met, but throws an error when they're not. This makes it perfect for checking preconditions in your program.
print
Statement
The print
statement is your next best friend.
It's super handy for checking what's happening inside functions during execution. Local variables (variables defined inside functions) can't be accessed from outside the function, so print
statements help you peek inside.
Let's look at an example with a function that takes x, y, z arguments and swaps x and y:
The AssertionError
tells us something's wrong, but it's hard to figure out exactly what. That's where print
statements come to the rescue.
Using print
statements, we can see that after the first if
statement, the local variable values got messed up.
By adding a local variable, we can get the intended behavior and make the AssertionError
disappear.
Types of Errors
There are basically three types of errors.
Syntax Errors
Syntax errors happen when your code doesn't follow Python's rules.
Common examples:
- Forgetting to close quotes or brackets
- Forgetting colons
- Messed up indentation
Syntax errors don't happen during program execution - they prevent the program from running at all.
Runtime Errors
Runtime errors occur when you're actually running the program.
Examples include:
- Using undefined variables or functions →
NameError
- Trying to reference a local variable as if it were global →
UnboundLocalError
- Dividing by zero →
ZeroDivisionError
Runtime errors have specific, descriptive names. Reading the error messages carefully often helps you fix them.
Logic Errors
Logic errors happen when your program runs fine but doesn't do what you intended. This isn't really an error with the program itself - it's a mistake made by the programmer.
Most bugs are actually logic errors.
This is where assert
statements shine again. By adding assertions to check preconditions, you can convert logic errors into AssertionError
s, making them easier to spot.
Combining assert
and print
statements gives you the basics of debugging.
Keep struggling (and enjoying) your Python learning journey!
See you later! 👋
Top comments (0)