测试类属性

testing.md
commit: b0e0ad6490d6517c19546b1023948986578fc378
本章译文最后维护日期:2020-11-10

以下属性用于指定函数来执行测试。在“测试(test)”模式下编译 crate 可以构建测试函数以及构建用于执行测试(函数)的测试套件(test harness)。启用测试模式还会启用 test条件编译选项

test属性

test属性标记一个用来执行测试的函数。这些函数只在测试模式下编译。测试函数必须是自由函数和单态函数,不能有参数,返回类型必须是以下类型之一:

  • ()
  • Result<(), E> where E: Error

注意:允许哪些返回类型是由暂未稳定的 Termination trait 决定的。

注意:测试模式是通过将 --test 参数选项传递给 rustc 或使用 cargo test 来启用的。

返回 () 的测试只要结束(terminate)且没有触发 panic 就会通过。返回 Result<(), E> 的测试只要它们返回 Ok(()) 就算通过。不结束的测试既不(计为)通过也不(计为)失败。

#![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属性

test属性标注的(annotated with)函数也可以被 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消息中的字符串。如果在 panic消息中找不到该字符串,则测试将失败。可以使用 MetaNameValueStr元项属性句法或带有 expected字段的 MetaListNameValueStr元项属性句法来传递字符串。

#![allow(unused)] fn main() { #[test] #[should_panic(expected = "值未匹配上")] fn mytest() { assert_eq!(1, 2, "值未匹配上"); } }