1、測試函數的構成:
在最簡單的情形下,Rust中的測試就是一個標注有test屬性的函數。屬性 (attribute)是一種用于修飾Rust代碼的元數據。只需要將#[test]添加到關鍵字fn的上一行便可以將函數轉變為測試函數。當測試編寫完成后,我們可以使用cargo test命令來運行測試。這個命令會構建并執行一個用于測試的可執行文件,該文件在執行的過程中會逐一調用所有標注了test屬性的函數,并生成統計測試運行成功或失敗的相關報告。
2、使用assert! 宏檢查結果:
assert! 宏由標準庫提供,它可以確保測試中某些條件的值為true。assert! 宏可以接收一個能夠被計算為布爾類型的值作為參數。當這個值為true時,assert! 宏什么都不用做并正常通過測試。而當值為false時,assert! 宏就會調用panic! 宏,進而導致測試失敗。
3、使用assert_eq! 宏和assert_ne! 宏判斷相等性:
標準庫中專門提供了一對可以簡化編程的宏 :assert_eq!
和assert_ne!
。這兩個宏分別用于比較并斷言兩個參數相等或不相等。在斷言失敗時,它們還可以自動打印出兩個參數的值,從而方便我們觀察測試失敗的原因。
4、使用should_panic檢查panic:
為測試函數添加一個額外的新屬性:should_panic
。標記了這個屬性的測試函數會在代碼發生panic時順利通過,而在代碼不發生panic時執行失敗。
5、使用Result<T, E>編寫測試:
也可以用Result<T, E>來編寫測試!在運行失敗時返回一個Err值而不是觸發panic。示例:
#[cfg(test)]
mod tests {#[test]fn it_works() -> Result<(), String> {if 2 + 2 == 4 {Ok(())} else {Err(String::from("two plus two does not equal four"))}}
}
6、測試的組織結構:
Rust社區主要從以下兩個分類來討論測試:單元測試(unit test)和集成測試(integration test)。單元測試小而專注,每次只單獨測試一個模塊或私有接口。而集成測試完全位于代碼庫之外,和正常從外部調用代碼庫一樣使用外部代碼,只能訪問公共接口,并且在一次測試中可能會聯用多個模塊。
(1)、單元測試:
單元測試的目的在于將一小段代碼單獨隔離出來,從而迅速地確定這段代碼的功能是否符合預期。我們一般將單元測試與需要測試的代碼存放在src
目錄下的同一文件中。同時也約定俗成地在每個源代碼文件中都新建一個tests模塊來存放測試函數,并使用cfg(test)對該模塊進行標注。
(2)、集成測試:
在Rust中,集成測試是完全位于代碼庫之外的。集成測試調用庫的方式和其他的代碼調用方式沒有任何不同,這也意味著你只能調用對外公開提供的那部分接口。集成測試的目的在于驗證庫的不同部分能否協同起來正常工作。能夠獨立正常工作的單元代碼在集成運行時也會發生各種問題,所以集成測試的覆蓋率同樣是非常重要的。為了創建集成測試,你首先需要建立一個tests
目錄。