Rust <5>:測試

  測試運行順序:單元測試(同處於源文件中,以 #[cfg(tests)] 標記 mod,以 #[test] 標記 function)、集成測試(位於項目根路徑下的 tests 目錄下,不須要 #[cfg(tests)] 標記,但依然須要 #[test] 標記 function)、文檔測試。多線程

 

1、選項併發

cargo test [testN] -- --test-threads=1 --nocapture --ignored單元測試

[testN]:能夠指定單個測試模塊或測試用例的完整名稱單獨運行,不能批量指定;但能夠指定部分名稱,全部名稱包含此字符串的模塊(包含其中全部測試用例)、測試用例均會被執行;測試

--test-threads=1:默認是多線程併發運行測試用例,運行速度快,但會形成輸出內容交叉,指定單線程運行可保證有序輸出;線程

--nocapture:默認測試經過的用例,其輸出內容將會被捕獲(屏蔽),指定此選項將會一同顯示這些內容;blog

--ignored:被標記爲 #[ignore] 的測試用例默認不會被執行,指定此項以運行這些測試用例(一般是預計耗時很長的測試);文檔

...字符串

2、單元測試示例it

#[derive(Debug)]
pub struct Rectangle {
    length: u32,
    width: u32,
}

impl Rectangle {
    pub fn can_hold(&self, other: &Rectangle) -> bool {
        return self.length > other.length && self.width > other.width;
    }

    pub fn add_two(&mut self) {
        self.length += 2;
        self.width += 2;
    }
}

#[cfg(test)]
mod should_panic {
    #[test]
    fn notihing() {
        println!("nothing...");
    }

}

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

    #[test]
    fn explotion() {
        assert_eq!(2 + 2, 4);
    }

    #[test]
    fn hellokitty() {
        assert_ne!(1 + 1, 4);
    }

    #[test]
    fn larger_can_hold_smaller() {
        let larger = Rectangle { length: 8, width: 7 };
        let smaller = Rectangle { length: 5, width: 1 };

        assert!(larger.can_hold(&smaller));
    }

    #[test]
    fn smaller_cannot_hold_larger() {
        let larger = Rectangle { length: 8, width: 7 };
        let smaller = Rectangle { length: 5, width: 1 };

        assert!(!smaller.can_hold(&larger));
    }

    #[test]
    #[ignore]
    #[should_panic(expected = "t")]
    fn should_panic() {
        panic! ("test panic");
    }

    #[test]
    fn print_add2() {
        let mut model = Rectangle { length: 8, width: 1 };
        model.add_two();

        assert_eq!(model.length, 10);
    }
}

...io

相關文章
相關標籤/搜索