测试属性
以下 属性 用于指定执行测试的函数。在“测试”模式下编译包会构建测试函数以及用于执行测试的测试工具。启用测试模式还会启用 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"); } }