Cover Image for [Rust] Property-based testing やってみる

[Rust] Property-based testing やってみる

概要

Property-based testing という概念を最近やっと知ったので、Rustで試してみる

Property-based testing に関してはこの辺りを読むと良さげ Property Based Testing で ドメインロジックをテストする

rust には proptest いうcrateがあるようなのでこれを導入して試してみる

導入方法

Cargo.toml に以下を書く

[dev-dependencies]  
proptest = "1.1.0"

テスト書いてみる

&[String] -> HashMap<String, String> に変換するコードのテストをproptest

use std::collections::HashMap;  
  
pub fn from(attr: &[String]) -> HashMap<String, String> {  
    attr.chunks(2)  
        .filter_map(|chunk| {  
            let key = chunk.get(0)?;  
            let val = chunk.get(1)?;  
            Some((key.to_string(), val.to_string()))  
        })  
        .collect::<HashMap<String, String>>()  
}  
  
#[cfg(test)]  
mod tests {  
    use super::*;  
    use proptest::prelude::*;  
  
    proptest! {  
        #[test]  
        fn doesnt_crash(attr: Vec<String>) {  
            from(&attr);  
        }  
    }  
}

ざっくり清浄系とおすテストはこれで良さそう。 このコードだと失敗するパターンはほぼないが、特定のパターンのときにErrorを返すようなfunctionだとテストしやすそう。

どちらにせよ宣言的に書いておけば書いておくほど、proptestで吸収しやすくなるので本当に必要なところだけテスト書けばよくなるので良い。