Атрибут should_panic(expected)
Атрибут should_panic(expected) применяется к тестовым функциям
и позволяет проверить не только факт паники, но и то, что сообщение
паники содержит определённую подстроку. Параметром атрибут принимает
строковый литерал - ожидаемую часть сообщения паники.
Если тестируемая функция не паникует или сообщение паники не содержит указанную подстроку, тест считается проваленным.
Синтаксис
#[should_panic(expected = "текст сообщения")]
#[test]
fn test_name()
{
// код, который должен паниковать
}
Пример
Давайте напишем тест, который проверяет, что функция паникует
с сообщением, содержащим подстроку "invalid input":
fn process(value: i32)
{
if value < 0
{
panic!("invalid input: value is negative");
}
}
#[cfg(test)]
mod tests
{
use super::*;
#[test]
#[should_panic(expected = "invalid input")]
fn test_negative_value()
{
process(-1);
}
}
fn main()
{
println!("tests run separately");
}
Результат выполнения теста:
test tests::test_negative_value ... ok
Пример
Давайте рассмотрим случай, когда сообщение паники не совпадает с ожидаемым. Тест будет провален:
fn divide(a: i32, b: i32) -> i32
{
if b == 0
{
panic!("division by zero");
}
a / b
}
#[cfg(test)]
mod tests
{
use super::*;
#[test]
#[should_panic(expected = "invalid divisor")]
fn test_divide_by_zero()
{
divide(10, 0);
}
}
fn main()
{
println!("tests run separately");
}
Результат выполнения теста:
test tests::test_divide_by_zero ... FAILED
failures:
---- tests::test_divide_by_zero stdout ----
thread 'tests::test_divide_by_zero' panicked at 'division by zero', src/main.rs:5:6
note: panic did not contain expected string
panic message: `"division by zero"`,
expected substring: `"invalid divisor"`
Как видно из результата, тест не прошёл, потому что сообщение паники
"division by zero" не содержит ожидаемую подстроку
"invalid divisor".
Смотрите также
-
атрибут
should_panic,
который проверяет факт паники без указания сообщения -
макрос
panic!,
который вызывает панику с заданным сообщением -
атрибут
test,
который помечает функцию как тестовую -
атрибут
cfg(test),
который включает модуль только при запуске тестов