测试属性
以下 属性 用于指定执行测试的函数。在 “test” 模式下编译 crate 会启用构建测试函数以及用于执行测试的测试工具。启用测试模式还会启用 test
条件编译选项。
test
属性
test
属性 标记一个函数作为测试执行。
这些函数仅在测试模式下编译。
测试函数必须是自由的、单态的函数,不接受任何参数,并且返回类型必须实现 Termination
trait,例如
()
Result<T, E> where T: Termination, E: Debug
!
注意:测试模式通过将
--test
参数传递给rustc
或使用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"); } }