单元测试
函数测试
#[test]
标识
打开 src/lib.rs
文件,可以看到如下代码
#[test]
fn it_works() {
// do test work
}
Rust 中,只需要在一个函数的上面,加上 #[test]
就标明这是一个测试用的函数。有了这个属性之后,在使用 cargo build
编译时,就会忽略这些函数。使用 cargo test
可以运行这些函数。类似于如下效果:
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
Rust 提供了两个宏来执行测试断言:
assert!(expr) 测试表达式是否为 true 或 false
assert_eq!(expr, expr) 测试两个表达式的结果是否相等
比如
#[test]
fn it_works() {
assert!(false);
}
运行 cargo test
,你会得到类似下面这样的提示
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... FAILED
failures:
---- it_works stdout ----
thread 'it_works' panicked at 'assertion failed: false', /home/steve/tmp/adder/src/lib.rs:3
failures:
it_works
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured
thread '<main>' panicked at 'Some tests failed', /home/steve/src/rust/src/libtest/lib.rs:247
#[should_panic]
标识
如果你的测试函数没完成,或没有更新,或是故意让它崩溃,但为了让测试能够顺利完成,我们主动可以给测试函数加上 #[should_panic]
标识,就不会让 cargo test
报错了。如:
#[test]
#[should_panic]
fn it_works() {
assert!(false);
}
运行 cargo test
,结果类似如下:
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
#[ignore]
标识
有时候,某个测试函数非常耗时,或暂时没更新,我们想不让它参与测试,但是又不想删除它,这时,#[ignore]
就派上用场了。
#[test]
#[ignore]
fn expensive_test() {
// code that takes an hour to run
}
写上这个,运行 cargo test
的时候,就不会测试这个函数。