测试属性

以下 属性 用于指定用于执行测试的函数。 将 crate 编译为 "test" 模式将启用构建测试函数以及用于执行测试的测试工具。 启用测试模式还启用 test 条件编译选项

test 属性

test属性 用于标记一个函数作为测试用例执行。这些函数只在测试模式下编译。 测试函数必须是无参、单态函数,并且返回类型必须实现 Termination trait ,例如:

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

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

测试框架将调用返回值的 report 方法,并根据 ExitCode 代表的终止状态将测试分类为已通过或已失败。特别地:

  • 返回 () 的测试只要终止且未发生恐慌即为通过。
  • 返回 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 的函数也可以被标记为 ignoreignore 属性 告知测试框架不要将该函数作为测试执行,但在测试模式下它仍会被编译。

ignore 属性可以选择用 元名称值字符串 语法编写,以具体说明测试被忽略的原因。

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

注意: rustc 测试框架支持 --include-ignored 标志,以强制运行被忽略的测试。

should_panic 属性

带有 test 属性的返回类型为 () 的函数还可以带有 should_panic 属性。 should_panic 属性 表示仅当函数实际恐慌时,测试才会通过。

should_panic 属性可以选择性地接受一个输入字符串,该字符串必须出现在恐慌消息中。 如果在消息中未找到该字符串,则测试将失败。可以使用 元名称值字符串 语法或具有 expected 字段的 元列表名称值字符串 语法传递该字符串。

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