Rust:
テストの作成

どうやって:

Rustの組み込みテストフレームワークは、ユニットテスト、統合テスト、ドキュメントテストを外部ライブラリなしでサポートしています。テストは #[test] で注釈され、そのように注釈された任意の関数はテストとしてコンパイルされます。

ユニットテストを書く:

#[cfg(test)] でマークされた tests サブモジュールを使用して、テストしているモジュール内にユニットテストを配置します。これにより、テスト時にのみコンパイルされることが保証されます。

// lib.rs もしくは main.rs
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_adds_two() {
        assert_eq!(add(2, 2), 4);
    }
}

テストの実行:

$ cargo test

出力:

   Compiling your_package_name v0.1.0 (/path/to/your_package)
    Finished test [unoptimized + debuginfo] target(s) in 0.00 secs
     Running unittests src/lib.rs (または src/main.rs)

1つのテストを実行中
test tests::it_adds_two ... ok

テスト結果: ok。1つ通過;0つ失敗;0つ無視;0つ測定済み;0つフィルター外

統合テストを書く:

統合テストは、プロジェクトのトップレベルにある src の隣の tests ディレクトリに入ります。tests 内の各 .rs ファイルは、それぞれ別のクレートとしてコンパイルされます。

// tests/integration_test.rs
use your_package_name;

#[test]
fn it_adds_two() {
    assert_eq!(your_package_name::add(2, 2), 4);
}

人気のあるサードパーティライブラリを使ったテスト:

より広範なテスト機能については、proptest ライブラリは関数をテストするための幅広い入力を生成することができます。

Cargo.tomlproptest を開発依存関係として追加する:

[dev-dependencies]
proptest = "1.0"

自動的に生成された多くの入力で同じテストを実行するために proptest を使用する:

// tests/integration_test.rs もしくはモジュールの #[cfg(test)] の内部で

use proptest::prelude::*;

proptest! {
    #[test]
    fn doesnt_crash(a: i32, b:i32) {
        your_package_name::add(a, b);
    }
}

これは add が幅広い i32 の入力に対してパニックしないことをチェックします。