Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpPnTs 71 of 288 menu
◀ ▶

Тест на ожидаемую остановку в Rust

В разделе про модули мы уже писали блок #[cfg(test)] и функции с #[test]. Там успех - это когда проверки совпали. Иногда нужно убедиться, что код намеренно прерывает выполнение: для этого функцию теста помечают отдельным атрибутом.

Атрибут говорит сборщику тестов: если внутри произошла паника, прогон этой функции считается удачным. Без такой метки остановка означала бы провал теста.

Запишем функцию, которая останавливается при нуле, и тест, который ждет эту остановку:

fn reject_zero(n: i32) { if n == 0 { panic!("zero"); } } #[cfg(test)] mod tests { use super::*; #[test] #[should_panic] fn zero_stops() { reject_zero(0); } } fn main() { reject_zero(1); println!("ok"); }

Обычный запуск программы дойдет до печати "ok". Команда из корня проекта проверит только блок тестов, и zero_stops должна попасть в пройденные, потому что остановка внутри была ожидаемой:

cargo test

Дана функция:

fn must_positive(n: i32) { if n < 0 { panic!("negative"); } }

Добавьте блок тестов с одной проверкой, которая ждет остановку при отрицательном аргументе, и запустите cargo test.

Дан следующий код:

#[cfg(test)] mod tests { #[test] fn passes() { assert_eq!(1 + 1, 2); } }

Добавьте второй тест без атрибута ожидания остановки, внутри вызовите команду с текстом "fail", и скажите, пройдет ли cargo test.

Объясните, чем тест с ожиданием остановки отличается от обычного #[test], где внутри стоит assert_eq!.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить