Rust - Basic - 11 - Test

Test

整体来说,Rust 提供的功能比较简单,但也足够全面,适合 Test-Driven 的开发模式。可惜笔者工作的地方,大多数的版本迭代人力过于紧张、需求过于繁多,Test-Driven 的开发模式并不适合。等到有测试时间的时候,之后再补各种单元测试、集成测试,就很麻烦了。

Comprehension

  • 基础写法

    
    pub fn greeting(name: &str) -> String {
        String::from("Hello!")
    }
    
    pub struct Guess {
        value: i32,
    }
    
    impl Guess {
        pub fn new(value: i32) -> Guess {
            if value < 1 || value > 100 {
                panic!("Guess value must be between 1 and 100, got {}.", value);
            }
    
            Guess { value }
        }
    }
    
    #[cfg(test)]
    mod tests {
    		use super::*;
        #[test]
        fn it_works() {
    				// 也有 assert_ne! 可以使用
            assert_eq!(2 + 2, 4);
        }
    
    		#[test]
        fn will_fail() {
            panic!("Make this test fail");
        }
    
    		#[test]
        fn greeting_contains_name() {
            let result = greeting("Carol");
    				// assert 时如果不符合预期,可以 print hint
            assert!(
                result.contains("Carol"),
                "Greeting did not contain name, value was `{}`",
                result
            );
        }
    
    		#[test]
    		#[should_panic]
    		// should_panic 用于检测是否 panic
    		fn greater_than_100() {
            Guess::new(200);
        }
    }
    
    #[cfg(test)]
    mod tests2 {
        #[test]
    		// 使用 Result<T, E> 作为返回值,无法使用 should_panic trait
        fn it_works() -> Result<(), String> {
            if 2 + 2 == 4 {
                Ok(())
            } else {
                Err(String::from("two plus two does not equal four"))
            }
        }
    }
    

Origin

https://doc.rust-lang.org/book/ch11-00-testing.html