单元测试

函数测试

#[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 的时候,就不会测试这个函数。

下一页