🎃个人专栏:
🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客
🐳Java基础:Java基础_IT闫的博客-CSDN博客
🐋c语言:c语言_IT闫的博客-CSDN博客
🐟MySQL:数据结构_IT闫的博客-CSDN博客
🐠数据结构:数据结构_IT闫的博客-CSDN博客
💎C++:C++_IT闫的博客-CSDN博客
🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客
💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客
🥏python:python_IT闫的博客-CSDN博客
🐠离散数学:离散数学_IT闫的博客-CSDN博客
🥽Linux:Linux_Y小夜的博客-CSDN博客
🚝Rust:Rust_Y小夜的博客-CSDN博客
欢迎收看,希望对大家有用!
目录
🎯控制测试如何运行
🎃并行或连续的运行测试
🎃显示函数输出
🎯按测试的名称进行测试
🎯忽略测试
🎯控制测试如何运行
就像
cargo run
会编译代码并运行生成的二进制文件一样,cargo test
在测试模式下编译代码并运行生成的测试二进制文件。cargo test
产生的二进制文件的默认行为是并发运行所有的测试,并截获测试运行过程中产生的输出,阻止它们被显示出来,使得阅读测试结果相关的内容变得更容易。不过可以指定命令行参数来改变cargo test
的默认行为。可以将一部分命令行参数传递给
cargo test
,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给cargo test
的参数,接着是分隔符--
,再之后是传递给测试二进制文件的参数。运行cargo test --help
会提示cargo test
的有关参数,而运行cargo test -- --help
可以提示在分隔符之后使用的有关参数。
🎃并行或连续的运行测试
当运行多个测试时,Rust 默认使用线程来并行运行。这意味着测试会更快地运行完毕,所以你可以更快的得到代码能否工作的反馈。因为测试是在同时运行的,你应该确保测试不能相互依赖,或依赖任何共享的状态,包括依赖共享的环境,比如当前工作目录或者环境变量。
如果你不希望测试并行运行,或者想要更加精确的控制线程的数量,可以传递
--test-threads
参数和希望使用线程的数量给测试二进制文件。例如:$ cargo test -- --test-threads=1
🎃显示函数输出
默认情况下,当测试通过时,Rust 的测试库会截获打印到标准输出的所有内容。比如在测试中调用了
println!
而测试通过了,我们将不会在终端看到println!
的输出:只会看到说明测试通过的提示行。如果测试失败了,则会看到所有标准输出和其他错误信息。fn prints_and_returns_10(a: i32) -> i32 { println!("I got the value {}", a); 10}#[cfg(test)]mod tests { use super::*; #[test] fn this_test_will_pass() { let value = prints_and_returns_10(4); assert_eq!(10, value); } #[test] fn this_test_will_fail() { let value = prints_and_returns_10(8); assert_eq!(5, value); }}
注意输出中不会出现测试通过时打印的内容,即
I got the value 4
。因为当测试通过时,这些输出会被截获。失败测试的输出I got the value 8
,则出现在输出的测试摘要部分,同时也显示了测试失败的原因。如果你希望也能看到通过的测试中打印的值,也可以在结尾加上
--show-output
告诉 Rust 显示成功测试的输出。$ cargo test -- --show-output
🎯按测试的名称进行测试
有时运行整个测试集会耗费很长时间。如果你负责特定位置的代码,你可能会希望只运行与这些代码相关的测试。你可以向
cargo test
传递所希望运行的测试名称的参数来选择运行哪些测试。pub fn add_two(a: i32) -> i32 { a + 2}#[cfg(test)]mod tests { use super::*; #[test] fn add_two_and_two() { assert_eq!(4, add_two(2)); } #[test] fn add_three_and_two() { assert_eq!(5, add_two(3)); } #[test] fn one_hundred() { assert_eq!(102, add_two(100)); }}
🎯忽略测试
有时一些特定的测试执行起来是非常耗费时间的,所以在大多数运行
cargo test
的时候希望能排除它们。虽然可以通过参数列举出所有希望运行的测试来做到,也可以使用ignore
属性来标记耗时的测试并排除它们,如下所示:#[test]fn it_works() { assert_eq!(2 + 2, 4);}#[test]#[ignore]fn expensive_test() { // 需要运行一个小时的代码}
对于想要排除的测试,我们在
#[test]
之后增加了#[ignore]
行。现在如果运行测试,就会发现it_works
运行了,而expensive_test
没有运行。如果我们只希望运行被忽略的测试,可以使用
cargo test -- --ignored