之前的文章:
本章主要介绍 rust 自身的测试体系,以及测试用例编写方法和注意事项。
测试函数
rust 自身有比较完整且很易用的测试体系,意在鼓励编写测试代码。
习惯上,可以直接在代码文件中内联一个测试模块,例如:
fn add(a: u32, b: u32) -> u32 {a + b}fn main() {// ...}// 一个测试模块#[cfg(test)]mod test {use super::*;// 一个测试点#[test]fn add_one_two() {// 调用需要测试的函数let sum = add(1, 2);// 断言以上函数的运行结果:// 如果 sum 等于 3 则测试通过;// 否则产生一个 panic ,使测试不通过。assert_eq!(sum, 3);}}
在测试函数内产生的任何 panic 都会使这个测试点不通过。不过,通常不直接用 panic! ,而是用 assert_eq! 来验证结果是不是符合预期。另外两个类似的宏是 assert! 和 assert_ne! ,例如:
fn add(a: u32, b: u32) -> u32 {a + b}fn main() {// ...}#[cfg(test)]mod test {use super::*;#[test]fn add_one_two() {// 调用需要测试的函数let sum = add(1, 2);// 断言以上函数的运行结果:// 如果 sum 不等于 2 则测试通过。assert_ne!(sum, 2);// 断言:// 如果 sum 大于 2 则测试通过。assert!(sum > 2);}}
所有 #[test] 函数可以用 cargo test 命令来全部运行:
cargo test
如果只想运行某些指定的测试点,可以加上过滤器:
cargo test add
上面这个命令将只会运行函数名包含有 add 的测试点。
crate 测试
对于 lib 类型的 crate ,也可以将测试代码放在独立的文件中。
首先在 Cargo.toml 中确保它是 lib crate :
[lib]crate-type = ['rlib']
然后就可以在 Cargo.toml 的同级目录中放置一个新目录 tests ,里面可以有若干个 *.rs 文件,每个文件都可以包含很多个测试点。例如在 tests/add.rs 中:
// 引用当前的 crate// ( my_crate 需要是当前 crate 的名字)use my_crate::*;// 一个测试点#[test]fn add_one_two() {let sum = add(1, 2);assert_eq!(sum, 3);}
这种方式比较适合对于整个 lib crate 的测试。
测试输出
在实际开发过程中,有时想要在测试代码中输出一些中间结果,例如:
#[test]fn add_one_two() {let sum = add(1, 2);println!("{}", sum);}
然而上面这句 println! 并没有效果,因为默认情况下 cargo test 命令不会展示 #[test] 函数运行期间的输出。此时可以在命令末尾加上一个选项,使得输出能展示出来:
cargo test -- --show-output
rust 自带的测试体系其实是在鼓励写代码的同时写好测试点,提升项目代码质量。另一个 rust 自带的重要辅助功能是文档体系,同样是非常易用的,这将在之后的文章中介绍。
文章转载自最后的叶子的奇妙小屋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




