测试属性

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

test 属性

test 属性标记一个函数作为测试执行。

这些函数仅在测试模式下编译。

测试函数必须是无参的、自由的、单态函数,其返回类型必须实现Termination trait,例如

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

注意

通过向 rustc 传递 --test 参数或使用 cargo test 来启用测试模式。

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

  • 返回 () 的测试只要它们终止且不 panic,就会通过。
  • 返回 Result<(), E> 的测试只要它们返回 Ok(()),就会通过。
  • 返回 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");
}
}