Rust入坑指南:步步为营 (2)

我们在开发过程中肯定不会每次都去跑全量的单元测试,那样太浪费时间了。通常是我们开发完一个功能之后,编写对应的单元测试,然后单独跑这个测试。那么Rust中能不能单独跑一个单元测试呢?答案是肯定的。

相信细心的同学已经发现了,Rust测试结果中,是针对每个测试单独统计结果,并且每个测试都有自己的名字,像我们前面写的it_works和internal。假设我们的代码中同时存在这两个函数,如果你想要单独跑internal这一个测试,就可以使用cargo test internal命令。

你也可以使用这种方法来执行多个名称类似的测试,假如我们有名称为internal_a的测试,那么执行cargo test internal命令时它也会被执行。

忽略某个测试

当我们有一个测试执行时间非常长的时候,我们一般不会轻易去执行,这时如果你想要执行多个测试,除了用我们上面提到的方法,去指定不同的名称列表以外。还可以把这个测试忽略掉。

现在我不想执行internal测试了,只需要对代码进行如下改动:

#[test] #[ignore] fn internal() { assert_eq!(4, internal_adder(2, 2)); }

这时再来运行测试,结果如图所示。

忽略测试

我们发现此时internal测试已经被忽略了。

测试异常情况

除了测试代码逻辑正常的情况,我们有时还需要测试一些异常情况,比如接收到非法参数时程序能否返回我们希望看到的异常。

我们首先来看一下如何测试程序返回异常信息。

Rust为我们提供了一个叫做should_panic的注解。我们可以使用它来测试程序是否返回异常:

pub fn add_two(a: i32) -> i32 { internal_adder(a, 2) } fn internal_adder(a: i32, b: i32) -> i32 { if a < 0 { panic!("a should bigger than 0"); } a + b } #[cfg(test)] mod tests { use super::*; #[test] #[should_panic] fn internal() { assert_eq!(4, internal_adder(-2, 2)); } }

此时我们运行测试时就会发现internal测试通过,因为它发生了线程恐慌,这是我们希望看到的结果。

测试异常

另外,我们还可以再指定我们具体期望的异常,那么就可以在should_panic后面加上expected参数。

#[test] #[should_panic(expected = "a should be positive")] fn internal() { assert_eq!(4, internal_adder(-2, 2)); }

大家可以自行运行一下这段测试代码看看效果。

总结

文中我向大家介绍了在Rust中如何进行单元测试、集成测试,还有比较特殊的文档测试。最后还介绍了3种常见的测试特性。

最后想友情提醒大家一下,在开发过程中,不要写完一堆功能后再开始写单元测试,这时你很有可能会因为测试代码过于繁琐而放弃。建议大家每写一个功能,随即开始进行单元测试,这样也能立即看到自己的代码的执行效果,提高成就感。这就是所谓的“步步为营”。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywzsd.html