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.toml
に proptest
を開発依存関係として追加する:
[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
の入力に対してパニックしないことをチェックします。