Table of Contents |
---|
Introduction to testing exceptions
To make tests robust and detailed we also should check all exceptions which can occur during code execution. To In order to write assertions about raised exceptions, you can use pytest.raises() as a context manager. For this example, we are going to write a test to check whether the divide() function returns an exception during a dividing number by zero or not. Like in the previous section all tests will be collected in the test_operations.py file and all new functions will be added to the operations.py file.
...
Code Block | ||
---|---|---|
| ||
. └── calculator ├── sources │ ├── operations.py │ └── __init__.py └── tests ├── __init__.py └── test_operations.py |
ZeroDivisionError example
For the record division() function looks like this:
...
Code Block | ||
---|---|---|
| ||
pytest pytest -k zero -v |
Test passed. As expected, the division method returns a ZeroDivisionError exception.
...
If there is a need to have access to the actual exception info the Pytest context manager optionally lets you add as 'your_text' like in the example below. "'exception_info" is an ExceptionInfo instance' is an ExceptionInfo
instance, which is a wrapper around the actual exception raised. The main attributes of interest are .type
, .
value and value
and .traceback
.
Code Block | ||
---|---|---|
| ||
import pytest from sources.operations import divide def test_division_by_zero_with_exception_info(): with pytest.raises(ZeroDivisionError) as exception_info: division(1, 0) assert "division by zero" in str(exception_info.value) |
IndexError example
For the IndexError example we need to create another python function:
...
We expect there is no possibility to select the 10th element from the list of three. Our test passed because of the IndexError exception.
TypeError example
Moreover, there is also a change chance that arguments provided to the test_select_item_from_list function have an improper type. To verify that we are going to check if the TypeError exception was raised. Let's add another test to test_selected_item_from_list():
Code Block | ||
---|---|---|
| ||
from sources.operations import select_item_from_list def test_select_item_from_list(): with pytest.raises(IndexError): select_item_from_list([1, 2, 3], 10) with pytest.raises(TypeError): select_item_from_list('list A', 'index') |
ValueError example
For ValueError example there is new function called find_item_possition_in_list:
...
As expected there is no change to find a position of element '1' in an empty list. Let's run the test and check the output.
The ValueError raised and test_find_item_position_in_list test passed.
ValueError - advanced example
Firstly let's write another function called reshape_array. The function arguments are a list (lst) and output array dimensions (x and y). The result is an array containing the same data with a new shape. To transform list to array and reshape it there is the NumPy package needed.
...
We used np. ndarray. all() to check if two NumPy arrays are equivalent.
The first test passed and raised a ValueError exception because there is no possibility to reshape the 4 elements list into 2x3 array. The second test also passed - a list of 4 elements can be reshaped into 2x2 array.
...