Функция assert_raises
Функция assert_raises из модуля numpy.testing предназначена для проверки того,
что переданная вызываемая функция или фрагмент кода генерирует ожидаемое исключение.
Она широко используется при написании тестов для библиотек, основанных на NumPy,
чтобы убедиться, что ошибки обрабатываются корректно.
Первым параметром функция принимает класс исключения, которое должно быть выброшено,
вторым - вызываемый объект (функцию или метод), а затем - аргументы, которые будут переданы в этот объект.
Кроме того, assert_raises можно использовать как менеджер контекста
с оператором with, что особенно удобно для проверки нескольких строк кода.
В этом случае исключение проверяется внутри блока with.
Функция возвращает объект исключения, что позволяет дополнительно проверить его атрибуты,
например, текст сообщения об ошибке.
Синтаксис
np.testing.assert_raises(exception, callable, *args, **kwargs)
Если исключение не было выброшено или было выброшено исключение другого типа,
тест завершится с ошибкой AssertionError.
Пример
Проверим, что передача нечисловых данных в функцию np.array с параметром dtype=np.int64
вызывает исключение TypeError:
import numpy as np
# Функция, которая будет вызываться в тесте
def create_int_array(data):
return np.array(data, dtype=np.int64)
# Вызов assert_raises: ожидаем TypeError
np.testing.assert_raises(TypeError, create_int_array, ['a', 'b', 'c'])
print("Тест пройден: исключение TypeError перехвачено")
Результат выполнения кода:
"Тест пройден: исключение TypeError перехвачено"
В этом примере функция create_int_array пытается преобразовать строки в целые числа,
что вызывает TypeError. assert_raises перехватывает это исключение, и тест считается успешным.
Пример
Использование assert_raises в качестве менеджера контекста для проверки деления на ноль
при работе с массивами NumPy:
import numpy as np
arr = np.array([1, 2, 3])
# Попытка деления на ноль вызовет предупреждение, но не исключение,
# поэтому используем операцию, которая гарантированно вызовет ошибку
with np.testing.assert_raises(ZeroDivisionError):
res = 1 / 0 # Имитируем ошибку
print("Контекстный менеджер отработал корректно")
Результат выполнения кода:
"Контекстный менеджер отработал корректно"
В этом примере внутри блока with мы искусственно вызываем ZeroDivisionError.
Если бы ошибка не возникла, assert_raises сгенерировала бы исключение, сообщающее о провале теста.
Пример
Проверим, что функция np.linalg.inv выбрасывает исключение np.linalg.LinAlgError
при попытке инвертировать вырожденную матрицу:
import numpy as np
# Создаём вырожденную матрицу (определитель равен нулю)
singular_matrix = np.array([[1, 2], [2, 4]])
# Проверяем, что при инвертировании возникает ошибка
np.testing.assert_raises(np.linalg.LinAlgError, np.linalg.inv, singular_matrix)
print("Ошибка LinAlgError перехвачена корректно")
Результат выполнения кода:
"Ошибка LinAlgError перехвачена корректно"
Этот пример демонстрирует, как assert_raises помогает тестировать функции линейной алгебры
на корректную обработку ошибок, связанных с сингулярными матрицами.
Смотрите также
-
функцию
assert_equal,
которая проверяет поэлементное равенство двух массивов -
функцию
assert_array_almost_equal,
которая проверяет массивы на приблизительное равенство с заданной точностью -
функцию
assert_allclose,
которая проверяет, что два массива близки по значениям с учётом абсолютной и относительной погрешности -
функцию
assert_array_less,
которая проверяет, что все элементы одного массива строго меньше элементов другого