测试属性
以下 属性 用于指定执行测试的函数。在“测试”模式下编译 crate 会启用测试函数的构建以及执行测试的测试工具。启用测试模式还会启用 test 条件编译选项。
test属性
test 属性 将一个函数标记为要作为测试执行。
例子
#![allow(unused)] fn main() { pub fn add(left: u64, right: u64) -> u64 { left + right } #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } }
test 属性使用 元字 语法格式。
test 属性只能应用于单态的、不带参数且返回类型实现 Termination 特型 的 自由函数。
注意
实现了
Termination特型 的一些类型包括:
()Result<T, E> where T: Termination, E: Debug
test 在函数上的第一次使用才有效。
注意
rustc对第一次使用之后的任何使用都会发出 lint 警告。这在将来可能会变为错误。
test 属性从标准库 预导入 std::prelude::v1::test 中导出。
这些函数只在测试模式下编译。
注意
测试模式通过向
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()?; // 预期成功 do_the_thing(&state)?; // 预期成功 Ok(()) } }
ignore属性
ignore 属性 可以与 test 属性 一起使用,以告知测试工具不要将该函数作为测试执行。
例子
#![allow(unused)] fn main() { #[test] #[ignore] fn check_thing() { // ... } }
注意
rustc测试工具支持--include-ignored标志来强制运行被忽略的测试。
ignore 属性使用 元字 和 元名称值字符串 语法格式。
ignore 属性的 元名称值字符串 形式提供了一种方法来指定忽略测试的原因。
例子
#![allow(unused)] fn main() { #[test] #[ignore = "not yet implemented"] // 尚未实现 fn mytest() { // ... } }
ignore 属性只能应用于带有 test 属性注解的函数。
注意
rustc在其他位置的使用会被忽略,但会发出 lint 警告。这在将来可能会变为错误。
ignore 在函数上的第一次使用才有效。
注意
rustc对第一次使用之后的任何使用都会发出 lint 警告。这在将来可能会变为错误。
被忽略的测试在测试模式下仍然会被编译,但不会执行。
should_panic属性
should_panic 属性 会使测试仅在应用该属性的 测试函数 发生 恐慌 时才通过。
例子
#![allow(unused)] fn main() { #[test] #[should_panic(expected = "values don't match")] // 预期为“值不匹配” fn mytest() { assert_eq!(1, 2, "values don't match"); // 值不匹配 } }
should_panic 属性有以下形式:
-
例子
#![allow(unused)] fn main() { #[test] #[should_panic] fn mytest() { panic!("error: some message, and more"); } // 错误:一些消息,还有更多 } -
元名称值字符串 — 给定字符串必须出现在 恐慌 消息中,测试才能通过。
例子
#![allow(unused)] fn main() { #[test] #[should_panic = "some message"] // 一些消息 fn mytest() { panic!("error: some message, and more"); } // 错误:一些消息,还有更多 } -
元列表名称值字符串 — 与 元名称值字符串 语法格式 一样,给定字符串必须出现在 恐慌 消息中。
例子
#![allow(unused)] fn main() { #[test] #[should_panic(expected = "some message")] // 预期为“一些消息” fn mytest() { panic!("error: some message, and more"); } // 错误:一些消息,还有更多 }
should_panic 属性只能应用于带有 test 属性注解的函数。
注意
rustc在其他位置的使用会被忽略,但会发出 lint 警告。这在将来可能会变为错误。
should_panic 在函数上的第一次使用才有效。
注意
rustc对第一次使用之后的任何使用都会发出未来兼容性警告。这在将来可能会变为错误。
当使用 元名称值字符串 形式或带有 expected 键的 元列表名称值字符串 形式时,给定字符串必须出现在 恐慌 消息中的某个位置,测试才能通过。
测试函数的返回类型必须是 ()。