通过例子学习Rust

49.6 测试

To mark a function as a unit test, place #[test] (equivalent to #[cfg(test)]) above any function. The function must take no parameters and return nothing.

// unit-test.rs
// For .powi()
use std::num::Float;


fn distance(a: (f32, f32), b: (f32, f32)) -> f32 {
    (
        (b.0.powi(2) - a.0.powi(2)) +
        (b.1.powi(2) - a.1.powi(2))
    ).sqrt()
}

fn main() {
    println!("If you see this, the tests were not compiled nor ran!");
}

#[test]
fn distance_test() {
    assert!(distance((0f32, 0f32), (1f32, 1f32)) == (2f32).sqrt());
}

If you want the test to fail, just put #[should_fail] under #[test].

// fail.rs
#[test]
#[should_fail]
fn failing_test() {
    assert!(1i == 2i);
}

To run unit tests, add either the --test or --cfg test flag to the command. When using either flag, you do not need a main() function as the executable will only include and run the functions flagged with #[test] or #[cfg(test)]. If you don't pass the --test flag, rustc will ignore any functions flagged with #[test]. That means calling any function flagged with #[test] will result in rustc: unresolved name if it is not compiled with --test.

note: programs compiled with --test ignore information passed to stdout

$ rustc --test unit-test.rs
$ ./unit-test
running 1 test
test distance_test ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

If --test were not included, then this would happen

$ rustc unit-test.rs
$ ./unit-test
If you see this, the tests were not compiled nor ran!