Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Атрибуты тестирования

Следующие атрибуты используются для указания функций для выполнения тестов. Компиляция крейта в режиме “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 имеет следующие формы:

  • MetaWord

    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, указанная строка должна присутствовать где-либо в сообщении паники для прохождения теста.

Возвращаемый тип тестовой функции должен быть ().