测试属性

以下 属性 用于指定执行测试的函数。在“测试”模式下编译包会构建测试函数以及用于执行测试的测试工具。启用测试模式还会启用 test 条件编译选项

test 属性

test 属性 标记要作为测试执行的函数。这些函数仅在测试模式下编译。测试函数必须是自由的、单态的、不带参数的函数,并且返回类型必须实现 Termination 特征,例如

  • ()
  • Result<T, E> 其中 T: Termination, E: Debug
  • !

注意:测试模式通过将 --test 参数传递给 rustc 或使用 cargo test 来启用。

测试工具调用返回值的 report 方法,并根据结果 ExitCode 是否表示成功终止来将测试分类为通过或失败。特别是

  • 只要测试终止且不发生 panic,返回 () 的测试就会通过。
  • 只要测试返回 Ok(()),返回 Result<(), E> 的测试就会通过。
  • 返回 ExitCode::SUCCESS 的测试通过,返回 ExitCode::FAILURE 的测试失败。
  • 未终止的测试既不通过也不失败。
#![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()?; // expected to succeed
    do_the_thing(&state)?;          // expected to succeed
    Ok(())
}
}

ignore 属性

使用 test 属性注释的函数也可以使用 ignore 属性进行注释。ignore 属性 告诉测试工具不要将该函数作为测试执行。它仍然会在测试模式下编译。

ignore 属性可以选择使用 MetaNameValueStr 语法编写,以指定忽略测试的原因。

#![allow(unused)]
fn main() {
#[test]
#[ignore = "not yet implemented"]
fn mytest() {
    // …
}
}

注意rustc 测试工具支持 --include-ignored 标志来强制运行被忽略的测试。

should_panic 属性

使用 test 属性注释并返回 () 的函数也可以使用 should_panic 属性进行注释。should_panic 属性 使测试仅在实际发生 panic 时才通过。

should_panic 属性可以选择性地接收一个输入字符串,该字符串必须出现在 panic 消息中。如果在消息中找不到该字符串,则测试将失败。可以使用 MetaNameValueStr 语法或带有 expected 字段的 MetaListNameValueStr 语法传递该字符串。

#![allow(unused)]
fn main() {
#[test]
#[should_panic(expected = "values don't match")]
fn mytest() {
    assert_eq!(1, 2, "values don't match");
}
}