测试属性
以下属性用于指定执行测试的函数。在“测试”模式下编译 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"); } }