Атрибут should_panic
Атрибут should_panic применяется к тестовым функциям
и указывает, что тест считается успешным только в том случае,
если во время его выполнения произошла паника.
Если паника не возникла, тест завершается с ошибкой.
Атрибут можно использовать как без параметров, так и
с параметром expected, который задаёт подстроку
ожидаемого сообщения о панике.
Без параметров атрибут should_panic просто проверяет
факт возникновения паники. С параметром expected
тест дополнительно проверяет, что сообщение о панике
содержит указанную подстроку. Это позволяет убедиться,
что паника вызвана именно ожидаемой причиной,
а не случайной ошибкой.
Атрибут should_panic работает совместно с атрибутом
#[test] и применяется только к тестовым функциям.
Его можно комбинировать с другими атрибутами тестирования.
Синтаксис
#[test]
#[should_panic]
fn test_name()
{
// код, который должен вызвать панику
}
С параметром expected:
#[test]
#[should_panic(expected = "текст сообщения")]
fn test_name()
{
// код, который должен вызвать панику
}
Пример
Давайте напишем тест, который должен вызвать панику
с помощью макроса panic!:
#[test]
#[should_panic]
fn test_panic()
{
panic!("something went wrong");
}
Этот тест пройдёт успешно, потому что внутри функции произошла паника. Если бы паники не было, тест завершился бы с ошибкой.
Пример
Давайте напишем тест, который проверяет конкретное
сообщение о панике с помощью параметра expected:
#[test]
#[should_panic(expected = "division by zero")]
fn test_division()
{
let a = 10;
let b = 0;
if b == 0 {
panic!("division by zero");
}
let _res = a / b;
}
Этот тест пройдёт успешно, так как сообщение о панике
содержит подстроку "division by zero".
Пример
Давайте напишем тест, который проверяет панику при выходе за границы массива:
#[test]
#[should_panic]
fn test_index_out_of_bounds()
{
let arr = vec![1, 2, 3, 4, 5];
let _res = arr[10];
}
Этот тест пройдёт успешно, потому что обращение к элементу с индексом 10 вызовет панику.
Пример
Давайте напишем тест, который НЕ пройдёт, потому что паника не возникает:
#[test]
#[should_panic]
fn test_no_panic()
{
let res = 2 + 2;
println!("{}", res);
}
Этот тест завершится с ошибкой, потому что
внутри функции не произошло паники,
а атрибут should_panic требует её наличия.
Смотрите также
-
атрибут
test,
который помечает функцию как тестовую -
атрибут
should_panic expected,
который проверяет конкретное сообщение о панике -
макрос
panic!,
который вызывает панику с заданным сообщением -
атрибут
ignore,
который позволяет пропустить выполнение теста