What is the purpose of matching exception messages in pytest?
Matching exception messages helps verify that the error raised is not only of the correct type but also contains the expected message, ensuring precise error handling.
Click to reveal answer
beginner
How do you check for a specific exception message in pytest?
Use the pytest.raises() context manager with the match parameter to specify a regex pattern that the exception message should match.
Click to reveal answer
beginner
Example: Write a pytest snippet to check if a ValueError is raised with message containing 'invalid input'.
import pytest
def test_invalid_input():
with pytest.raises(ValueError, match="invalid input"):
raise ValueError("This is an invalid input error")
Click to reveal answer
intermediate
Why use regex patterns in the match parameter instead of exact strings?
Regex allows flexible matching of exception messages, handling variations like additional details or formatting, making tests less brittle.
Click to reveal answer
beginner
What happens if the exception message does not match the pattern in pytest?
The test fails because pytest expects the exception message to match the pattern. This ensures the error is exactly what the test expects.
Click to reveal answer
Which pytest feature lets you check for an exception and its message?
Apytest.check_exception()
BassertRaises()
Cpytest.raises() with match parameter
Dtry-except block without pytest
✗ Incorrect
pytest.raises() with the match parameter is the correct way to check both exception type and message.
What type of pattern does the match parameter in pytest accept?
ARegular expression (regex)
BExact string only
CInteger value
DBoolean value
✗ Incorrect
The match parameter accepts a regex pattern to flexibly match exception messages.
If the exception message is 'File not found', which match pattern will correctly match it?
A"File.*found"
B"file not found"
C"File not found"
D"File notfound"
✗ Incorrect
The regex "File.*found" matches any characters between 'File' and 'found', covering the message.
What happens if the exception type is correct but the message does not match the pattern?
ATest passes
BTest is skipped
CTest raises a warning
DTest fails
✗ Incorrect
The test fails because both exception type and message must match.
Why is matching exception messages useful in testing?
ATo speed up test execution
BTo check error details and ensure correct error handling
CTo avoid writing tests
DTo ignore exceptions
✗ Incorrect
Matching messages confirms the error is exactly what the test expects, improving test accuracy.
Explain how to use pytest to check that a function raises a ValueError with a specific message.
Think about how to combine exception type and message checking in pytest.
You got /3 concepts.
Describe why using regex patterns for matching exception messages is better than exact string matching.
Consider how error messages might change slightly but still be valid.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of using pytest.raises() in a test?
easy
A. To check if a specific exception is raised during code execution
B. To skip a test when an exception occurs
C. To print the exception message to the console
D. To ignore exceptions and continue the test
Solution
Step 1: Understand pytest.raises() usage
The pytest.raises() function is used to verify that a block of code raises a specific exception.
Step 2: Purpose of pytest.raises()
It helps confirm that the code fails as expected by raising the correct error, which is important for testing error handling.
Final Answer:
To check if a specific exception is raised during code execution -> Option A
2. Which of the following is the correct syntax to check an exception message contains the word 'error' using pytest?
easy
A. with pytest.raises(ValueError) as exc_info:
assert 'error' in exc_info.value
B. with pytest.raises(ValueError) as exc_info:
assert exc_info.message == 'error'
C. with pytest.raises(ValueError) as exc_info:
assert exc_info.error == 'error'
D. with pytest.raises(ValueError) as exc_info:
assert 'error' in str(exc_info.value)
Solution
Step 1: Understand exc_info object
The exc_info object stores the caught exception. To get its message as a string, use str(exc_info.value).
Step 2: Correct assertion syntax
Checking if 'error' is in the exception message requires assert 'error' in str(exc_info.value). Directly accessing exc_info.value without converting to string won't work.
Final Answer:
with pytest.raises(ValueError) as exc_info:
assert 'error' in str(exc_info.value) -> Option D
Quick Check:
Exception message check uses str(exc_info.value) = C [OK]
Hint: Convert exc_info.value to string before checking message [OK]
Common Mistakes:
Forgetting to convert exc_info.value to string
Using exc_info.message which does not exist
Comparing exc_info.error instead of message
3. What will be the result of this pytest test code?
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError) as exc_info:
x = 1 / 0
assert 'division by zero' in str(exc_info.value)
medium
A. Test fails because exception message does not contain 'division by zero'
B. Test fails due to syntax error in the test code
C. Test passes because ZeroDivisionError is raised with correct message
D. Test passes but assertion is ignored
Solution
Step 1: Check exception raised
The code divides 1 by 0, which raises a ZeroDivisionError as expected.
Step 2: Verify exception message content
The message for ZeroDivisionError in Python includes 'division by zero', so the assertion passes.
Final Answer:
Test passes because ZeroDivisionError is raised with correct message -> Option C
Quick Check:
ZeroDivisionError message contains 'division by zero' = B [OK]
Hint: Check actual exception message text matches assertion [OK]
Common Mistakes:
Assuming exception message is different
Thinking assertion is ignored
Confusing syntax error with runtime error
4. Identify the error in this pytest test code snippet:
def test_key_error():
with pytest.raises(KeyError) as exc_info:
d = {'a': 1}
value = d['b']
assert 'b' in exc_info.value
medium
A. The assertion should convert exc_info.value to string before checking
B. The exception type should be ValueError, not KeyError
C. The dictionary key 'b' exists, so no exception is raised
D. pytest.raises() cannot catch KeyError exceptions
Solution
Step 1: Check exception type and code
Accessing d['b'] raises a KeyError because 'b' is not in the dictionary.
Step 2: Analyze assertion correctness
The assertion checks if 'b' is in exc_info.value directly, but exc_info.value is an exception object, not a string. It should be converted to string first.
Final Answer:
The assertion should convert exc_info.value to string before checking -> Option A
Quick Check:
Always use str(exc_info.value) for message checks = A [OK]
Hint: Always convert exc_info.value to string before assertions [OK]
Common Mistakes:
Checking exception object directly without str()
Using wrong exception type
Assuming key exists in dictionary
5. You want to test a function that raises a ValueError with message "Invalid input: 0" when input is zero. Which pytest test code correctly verifies both exception type and exact message?
hard
A. with pytest.raises(ValueError):
func(0)
assert 'Invalid input' in exc_info.value
B. with pytest.raises(ValueError) as exc_info:
func(0)
assert exc_info.value.args[0] == 'Invalid input: 0'
C. with pytest.raises(ValueError) as exc_info:
func(0)
assert exc_info.value.message == 'Invalid input: 0'
D. with pytest.raises(ValueError) as exc_info:
func(0)
assert str(exc_info.value) == 'ValueError: Invalid input: 0'
Solution
Step 1: Understand exception message access
Exception messages are stored in args tuple; the first element args[0] holds the message string.
Step 2: Verify correct assertion for exact message
Using exc_info.value.args[0] allows exact message comparison. Using str(exc_info.value) works but may include extra formatting. exc_info.value.message does not exist.
Final Answer:
with pytest.raises(ValueError) as exc_info:
func(0)
assert exc_info.value.args[0] == 'Invalid input: 0' -> Option B
Quick Check:
Use exc_info.value.args[0] for exact exception message = A [OK]
Hint: Use exc_info.value.args[0] for exact message match [OK]
Common Mistakes:
Using exc_info.value.message which is invalid
Checking message without exc_info context
Assuming str() always matches exactly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.