Rust by Example

19.2 テスト

関数のテストは以下のアトリビュートを用いて行うことができます。

  • #[test]は関数をユニットテスト化します。その場合その関数は引数と返り値が空でなくてはなりません。
  • #[should_panic]はパニックを引き起こすようなテストに用います。
// unit_test.rs
// テストを実行しない時に限り、`main`をコンパイルする。
#[cfg(not(test))]
fn main() {
    println!("If you see this, the tests were not compiled nor ran!");
}

// テストを実行するときのみ`test`モジュールをコンパイルする。
#[cfg(test)]
mod test {
    // `distance_test`が必要とするヘルパーメソッド
    fn distance(a: (f32, f32), b: (f32, f32)) -> f32 {
        (
            (b.0 - a.0).powi(2) +
            (b.1 - a.1).powi(2)
        ).sqrt()
    }

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

    #[test]
    #[should_panic]
    fn failing_test() {
        assert!(1i32 == 2i32);
    }
}

テストはcargo testあるいはrustc --testで実行します。

$ rustc --test unit_test.rs
$ ./unit_test

running 2 tests
test test::distance_test ... ok
test test::failing_test ... ok

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

もし--testフラグがない場合、出力は以下のようになります。

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

See also:

アトリビュート, 環境に応じたコンパイル, mod.