测试属性
以下 属性 用于指定用于执行测试的函数。
将 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
的函数也可以被标记为 ignore
。
ignore
属性 告知测试框架不要将该函数作为测试执行,但在测试模式下它仍会被编译。
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"); } }