Атрибуты тестирования
Следующие атрибуты используются для указания функций для выполнения тестов. Компиляция крейта в режиме “test” включает построение тестовых функций вместе с тестовым harness’ом для выполнения тестов. Включение тестового режима также включает условную компиляцию test.
Атрибут test
Атрибут test атрибуты помечает функцию для выполнения в качестве теста.
Example
#![allow(unused)] fn main() { pub fn add(left: u64, right: u64) -> u64 { left + right } #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } }
Атрибут test использует синтаксис MetaWord.
Атрибут test может применяться только к свободным функциям, которые являются моноформными, не принимают аргументов и возвращают тип, реализующий трейт Termination.
Note
Некоторые типы, реализующие трейт
Termination, включают:
()Result<T, E> where T: Termination, E: Debug
Только первое использование test на функции имеет эффект.
Note
rustcвыдаёт предупреждения при любом использовании после первого. В будущем это может стать ошибкой.
Атрибут test экспортируется из прелюдии стандартной библиотеки как std::prelude::v1::test.
Эти функции компилируются только в тестовом режиме.
Note
Тестовый режим включается передачей аргумента
--testвrustcили использованиемcargo test.
Test harness вызывает метод report возвращаемого значения и классифицирует тест как пройденный или проваленный в зависимости от того, представляет ли результирующий ExitCode успешное завершение.
В частности:
- Тесты, возвращающие
(), проходят, пока они завершаются и не паникуют. - Тесты, возвращающие
Result<(), E>, проходят, пока они возвращаютOk(()). - Тесты, возвращающие
ExitCode::SUCCESS, проходят, а тесты, возвращающиеExitCode::FAILURE, проваливаются. - Тесты, которые не завершаются, не проходят и не проваливаются.
Example
#![allow(unused)] fn main() { use std::io; fn setup_the_thing() -> io::Result<i32> { Ok(1) } fn do_the_thing(s: &i32) -> io::Result<()> { Ok(()) } #[test] fn test_the_thing() -> io::Result<()> { let state = setup_the_thing()?; // ожидается успех do_the_thing(&state)?; // ожидается успех Ok(()) } }
Атрибут ignore
Атрибут ignore атрибуты может использоваться с атрибутом test, чтобы указать test harness’у не выполнять эту функцию как тест.
Example
#![allow(unused)] fn main() { #[test] #[ignore] fn check_thing() { // … } }
Note
Test harness
rustcподдерживает флаг--include-ignoredдля принудительного запуска игнорируемых тестов.
Атрибут ignore использует синтаксисы MetaWord и MetaNameValueStr.
Форма MetaNameValueStr атрибута ignore предоставляет способ указать причину, по которой тест игнорируется.
Example
#![allow(unused)] fn main() { #[test] #[ignore = "not yet implemented"] fn mytest() { // … } }
Атрибут ignore может применяться только к функциям, аннотированным атрибутом test.
Note
rustcигнорирует использование в других позициях, но выдаёт предупреждения. В будущем это может стать ошибкой.
Только первое использование ignore на функции имеет эффект.
Note
rustcвыдаёт предупреждения при любом использовании после первого. В будущем это может стать ошибкой.
Игнорируемые тесты всё равно компилируются в тестовом режиме, но не выполняются.
Атрибут should_panic
Атрибут should_panic атрибуты приводит к тому, что тест проходит только если тестовая функция, к которой применён атрибут, вызывает панику.
Example
#![allow(unused)] fn main() { #[test] #[should_panic(expected = "values don't match")] fn mytest() { assert_eq!(1, 2, "values don't match"); } }
Атрибут should_panic имеет следующие формы:
-
Example
#![allow(unused)] fn main() { #[test] #[should_panic] fn mytest() { panic!("error: some message, and more"); } } -
MetaNameValueStr — Указанная строка должна присутствовать в сообщении паники для прохождения теста.
Example
#![allow(unused)] fn main() { #[test] #[should_panic = "some message"] fn mytest() { panic!("error: some message, and more"); } } -
MetaListNameValueStr — Как и в синтаксисе MetaNameValueStr, указанная строка должна присутствовать в сообщении паники.
Example
#![allow(unused)] fn main() { #[test] #[should_panic(expected = "some message")] fn mytest() { panic!("error: some message, and more"); } }
Атрибут should_panic может применяться только к функциям, аннотированным атрибутом test.
Note
rustcигнорирует использование в других позициях, но выдаёт предупреждения. В будущем это может стать ошибкой.
Только первое использование should_panic на функции имеет эффект.
Note
rustcвыдаёт предупреждения о совместимости с будущими версиями при любом использовании после первого. В будущем это может стать ошибкой.
Когда используется форма MetaNameValueStr или форма MetaListNameValueStr с ключом expected, указанная строка должна присутствовать где-либо в сообщении паники для прохождения теста.
Возвращаемый тип тестовой функции должен быть ().